使用查找值而不是外键ID在SQLAlchemy中创建新实例

时间:2015-10-22 07:30:17

标签: python mysql sqlalchemy

我有一个现有的数据库想要构建一个SQLAlchemy包装器来使用Python中的数据库。 DB中通常使用如下所示的查找表:

class Industry(Base):
    __tablename__ = 'industry'
    id = Column(Integer, primary_key=True)
    name = Column(String, nullable=True)

class IndustrySector(Base):
    __tablename__ = 'industry_sector'
    id = Column(Integer, primary_key=True)
    industry_id =  Column(Integer, ForeignKey('industry.id'), nullable=False)
    name = Column(String, nullable=True)

我想要做的是使用行业名称而不是行业的(技术)密钥创建一个新的IndustrySector实例,即

new_industry_sector = IndustrySector(industry_id = 'Manufacturing', name = 'Textile')

而不是

manu_industry_id = session.query(Industry.id).filter(Industry.name=='Manufacturing').first().id
new_industry_sector = IndustrySector(name = 'Textile', industry_id = new_industry_id)

显然,上面的示例无法正常工作,因为我正在过滤ID而不是名称。但我不知道如何获得外键表的名称。当然我可以简单地添加一个处理查找的@class方法,但是如果存在任何内置功能,我宁愿使用它。

赞赏任何帮助/指示

1 个答案:

答案 0 :(得分:0)

您可以创建一个构造函数,只要创建了一个对象,它就会用id值替换该字符串。

class IndustrySector(Base):
    __tablename__ = 'industry_sector'
    id = Column(Integer, primary_key=True)
    industry_id =  Column(Integer, ForeignKey('industry.id'), nullable=False)
    name = Column(String, nullable=True)

    def __init__(self, industry_id, name):
        self.name = name
        self.industry_id = fetch_id(industry_id)

    def fetch_id(industry_id):
        # fetch and return the id