gpt4 book ai didi

mysql - SQLAlchemy - 自动查找插入的外键关系

转载 作者:行者123 更新时间:2023-11-29 00:22:29 25 4
gpt4 key购买 nike

我正在尝试让 SQLAlchemy ORM 类自动:

查找字段的外键id

对于该字段尚未在外键表中的条目,将行添加到外键表中 - 并使用原始表中自动生成的 ID。

举例说明:

类定义

class EquityDB_Base(object):

@declared_attr
def __tablename__(cls):
return cls.__name__.lower()

__table_args__ = {'mysql_engine': 'InnoDB'}
__mapper_args__= {'always_refresh': True}

id = Column(Integer, primary_key=True)

def fk(tablename, nullable=False):
return Column("%s_id" % tablename, Integer,
ForeignKey("%s.id" % tablename),
nullable=nullable)

class Sector(EquityDB_Base, Base):
name = Column(String(40))

class Industry(EquityDB_Base, Base):
name = Column(String(40))
sector_id = fk('sector')
sector = relationship('Sector', backref='industries')

class Equity(EquityDB_Base, Base):
symbol = Column(String(10), primary_key=True)
name = Column(String(40))
industry_id = fk('industry')
industry = relationship('Industry', backref='industries')

使用类设置行业和部门

for i in industry_record[]:
industry = Industry(id=i.id,
name=i.name,
sector=Sector(name=i.sector_name))
session.merge(industry)

结果不幸的是,当我运行它时——数据库为每次重复使用“sector_name”而将单独的行添加到扇区表中——例如,如果 10 个行业使用“Technology”作为它们的扇区名称,我为每个行业获得 10 个唯一的 sector_id 10 个行业。

我想要的 - 每次出现数据库中已有的扇区名称时,它都会自动解析为适当的扇区 ID

我显然只是在学习 SQLAlchemy,但似乎无法弄清楚如何启用此行为。

如有任何帮助,我们将不胜感激!

最佳答案

参见类似问题的答案 create_or_get entry in a table .
应用相同的逻辑,你会得到这样的东西:

def create_or_get_sector(sector_name):
obj = session.query(Sector).filter(Sector.name == sector_name).first()
if not obj:
obj = Sector(name = sector_name)
session.add(obj)
return obj

并像下面这样使用它:

for i in industry_record[:]:
industry = Industry(id=i.id,
name=i.name,
sector=create_or_get_sector(sector_name=i.sector_name))
session.merge(industry)

您应该注意的一件事是 create_or_get_sector 中使用了哪个 session 实例。

关于mysql - SQLAlchemy - 自动查找插入的外键关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20601485/

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