117 lines
3.1 KiB
Python
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()
|