from datetime import datetime from sqlalchemy import create_engine, Column from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, relationship from sqlalchemy.sql.schema import ForeignKey from sqlalchemy.sql.sqltypes import Boolean, DateTime, Integer, String from normalutils.choices import StateType oengine = create_engine("sqlite:///db.sqlite3", future=True) Base = declarative_base() OSession = sessionmaker(oengine, future=True) class OWord(Base): __tablename__ = "word_word" id = Column("word_id", Integer, primary_key=True) spelling = Column(String(64), nullable=False, unique=True) importance = Column(String(32), nullable=True) state = Column(String(2), default=StateType.CHECKING.value, nullable=False) class OMeaningField(Base): __tablename__ = "meaning_meaningfield" id = Column("meaningfield_id", Integer, primary_key=True) current_version = Column(Integer, default=1) has_many = Column(Boolean, default=False) word_id = Column(Integer, ForeignKey("word_word.word_id", ondelete="CASCADE")) word = relationship("OWord", backref="meaningfields") class OMeaning(Base): __tablename__ = "meaning_meaning" id = Column("meaning_id", Integer, primary_key=True) meaningfield_id = Column( Integer, ForeignKey("meaning_meaningfield.meaningfield_id", ondelete="CASCADE") ) author_id = Column(Integer, nullable=True) author_name = Column(String(64), nullable=True) state = Column(String(2), default=StateType.CHECKING.value, nullable=False) word_property = Column(String(8), nullable=False) field = Column(String(64), nullable=True) version = Column(Integer, default=1, nullable=False) meaning = Column(String(128), nullable=False) sentence = Column(String(256), nullable=True) add_time = Column(DateTime, default=datetime.utcnow) meaningfield = relationship("OMeaningField", backref="meanings") if __name__ == "__main__": with OSession() as session: meaning = session.query(OMeaning).first() print(meaning.meaningfield.word.id)