我正在尝试自动获取SQLAlchemy ORM类:
查找字段的外键ID
OR
对于该字段尚未在外键表中的条目,将该行添加到外键表 - 并使用原始表中的自动生成的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个行业。
我想要的 - 每次显示已存在于数据库中的扇区名称,以便自动解析为相应的sector_id
我显然只是在学习SQLAlchemy,但似乎无法弄清楚如何启用此行为。
任何帮助将不胜感激!
答案 0 :(得分:1)
查看类似问题的答案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)
您应该注意的一件事是session
中使用了create_or_get_sector
个实例。