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

时间:2013-12-15 23:58:38

标签: mysql sqlalchemy

我正在尝试自动获取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,但似乎无法弄清楚如何启用此行为。

任何帮助将不胜感激!

1 个答案:

答案 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个实例。