Как и почему SQLAlchemy облегчает создание виртуальных столбцов, стало для меня более очевидным, и теперь, когда у меня установлены двунаправленные отношения между родительскими и дочерними таблицами, каковы некоторые объектно-ориентированные способы, которыми эти таблицы могут быть заполняется и запрашивается, чтобы наилучшим образом использовать такие отображения Python -национальным образом?
Если есть лучший способ представить здесь отношения, возможно, с помощью таблицы ассоциаций, мне также интересно изучить словарь и шаблоны, уникальные для SQLAlchemy, которые позволили бы использовать такую сущность там, где это полезно.
from datetime import datetime
from dataclasses import dataclass, InitVar, field
from typing import Any, List, ClassVar
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# from flask_login import UserMixin
from sqlalchemy import Column, Integer, String
from sqlalchemy import ForeignKey
from sqlalchemy.types import Boolean, DateTime
from sqlalchemy.orm import relationship
# import sqlalchemy.dialects.sqlite
# db = SQLAlchemy()
app = Flask(__name__.split('.')[0])
class Vars():
prefix = "classic"
app.config.__setitem__('SQLALCHEMY_DATABASE_URI', f'sqlite:///{Vars.prefix}.sqlite')
app.config['SQLALCHEMY_BINDS'] = {
Vars.prefix: app.config.get('SQLALCHEMY_DATABASE_URI')
}
app.config.__setitem__('SQLALCHEMY_TRACK_MODIFICATIONS', False)
db = SQLAlchemy(app)
@dataclass
class U_Mixin(db.Model): # (object) if not __abstract__ = True
wabisabi: ClassVar
id: int
__abstract__ = True # use if inheriting from db.Model
__bind_key__ = ""
id = Column(Integer, primary_key=True, nullable=False)
@dataclass
class Parent(U_Mixin):
parentname: str
__bind_key__ = Vars.prefix
parentname = Column(String)
child_id = Column(Integer, ForeignKey('child.id'))
children = relationship('Parent', backref='children')
@dataclass
class Child(U_Mixin):
childname: str
__bind_key__ = Vars.prefix
childname = Column(String)
parent_id = Column(Integer, ForeignKey('parent.id'))
parents = relationship('Child', backref='parents')
if __name__=="__main__":
db.create_all()