demo1/desktop/db.py

117 lines
3.1 KiB
Python

from datetime import datetime
from sqlalchemy import Column, Integer, DateTime, VARCHAR, DATE, TEXT, ForeignKey, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker, Session
__factory = None
base = declarative_base()
class BaseModel(base):
__abstract__ = True
id = Column(Integer, primary_key=True, autoincrement=True)
class Role(BaseModel):
__tablename__ = 'roles'
title = Column(VARCHAR(50), nullable=False)
class Gender(BaseModel):
__tablename__ = 'genders'
title = Column(VARCHAR(50), nullable=False)
class Country(BaseModel):
__tablename__ = 'countries'
title = Column(VARCHAR(250), nullable=False)
english_title = Column(VARCHAR(250), nullable=False)
code_alpha = Column(VARCHAR(10), nullable=False)
code_digits = Column(VARCHAR(10), nullable=False)
cities = relationship('City', backref='country')
class City(BaseModel):
__tablename__ = 'cities'
title = Column(VARCHAR(250), nullable=False)
country_id = Column(Integer, ForeignKey('countries.id'), nullable=False)
country = relationship('Country', backref='cities')
events = relationship('Event', backref='city')
class User(BaseModel):
__tablename__ = 'users'
last_name = Column(VARCHAR(50), nullable=False)
first_name = Column(VARCHAR(50), nullable=False)
patronym = Column(VARCHAR(50))
email = Column(VARCHAR(150), nullable=False)
birthday = Column(DATE, nullable=False)
phone = Column(VARCHAR(50), nullable=False)
password = Column(TEXT, nullable=False)
photo = Column(TEXT, nullable=False)
gender_id = Column(Integer, ForeignKey('genders.id'), nullable=False)
role_id = Column(Integer, ForeignKey('roles.id'), nullable=False)
country_id = Column(Integer, ForeignKey('countries.id'), nullable=False)
moders = relationship('Moder', backref='user')
class Direction(BaseModel):
__tablename__ = 'directions'
title = Column(VARCHAR(150), nullable=False)
moders = relationship('Moder', backref='direction')
class Event(BaseModel):
__tablename__ = 'events'
title = Column(VARCHAR(250), nullable=False)
date = Column(DATE, nullable=False)
days_count = Column(Integer, nullable=False)
city_id = Column(Integer, ForeignKey('cities.id'), nullable=False)
city = relationship('City', backref='events')
moders = relationship('Moder', backref='event')
class Moder(BaseModel):
__tablename__ = 'moders'
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
event_id = Column(Integer, ForeignKey('events.id'), nullable=False)
direction_id = Column(Integer, ForeignKey('directions.id'), nullable=False)
user = relationship('User', backref='moders')
event = relationship('Event', backref='moders')
direction = relationship('Direction', backref='moders')
def init_db():
global __factory
eng = create_engine('postgresql+pg8000://postgres:2509@localhost:5432/demo_1')
__factory = sessionmaker(bind=eng)
base.metadata.create_all(eng)
def connect() -> Session:
global __factory
return __factory()