gpt4 book ai didi

python - 基于记录数据的SqlAlchemy模型关联

转载 作者:太空宇宙 更新时间:2023-11-04 01:36:38 30 4
gpt4 key购买 nike

有一个info 表,它与car 表或suv 表有关系。

它在 info.type 字段中指定。

那么如何根据记录的类型数据动态创建关联呢?

class Info(Base):
item_id = Column(ForeignKey('cars-or-suvs-table.id'))
type = Column(String())

class Car(Base):
- data -

info = relationship('Info', backref="car")

class Suv(Base):
- data -

info = relationship('Info', backref="suv")

编辑:我的表中已经填满了数据,所以我无法更改数据库架构。

最佳答案

由于您正在寻找不需要将外键移动到不同表的解决方案,因此您可以尝试这种方法:

import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import sql
Base = declarative_base()
engine = sqlalchemy.create_engine('sqlite:///:memory:')
Session = sessionmaker(bind=engine)
session = Session()

class Info(Base):
__tablename__ = 'info'
id = Column(Integer(), primary_key=True)
type = Column(String())
item_id = Column(Integer())

@property
def item(self):
if self.type == 'car':
return self._car
elif self.type == 'suv':
return self._suv
return None

@item.setter
def item(self, value):
if value is not None:
self.item_id = value.id
self.type = value.__tablename__
else:
self.item_id = None

class Car(Base):
__tablename__ = 'car'
id = Column(Integer(), primary_key=True)
info = relationship(Info, primaryjoin=sql.and_(id == Info.item_id, Info.type == 'car'), foreign_keys=Info.item_id, uselist=False, backref='_car')

class Suv(Base):
__tablename__ = 'suv'
id = Column(Integer(), primary_key=True)
info = relationship(Info, primaryjoin=sql.and_(id == Info.item_id, Info.type == 'suv'), foreign_keys=Info.item_id, uselist=False, backref='_suv')

我将 Info.car 重命名为 Info._car,因为即使 .type 是“suv”,._car 也不可避免地是一个伪造的汽车对象。

为了简单起见,我已将事件监听器的内容排除在外,但您绝对可以从我的其他答案中调整您需要的部分,以避免事情进入不一致的状态。

关于python - 基于记录数据的SqlAlchemy模型关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9137071/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com