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()