使用SqlAlchemy ORM将一列引用到另一个不同的表中

时间:2017-09-18 10:00:38

标签: python postgresql sqlalchemy

我有以下情况,

  1. 我需要插入一个表(table1),其主键为'serial'。
  2. 现在我需要插入另一个表(table2),其中包含table1的主键作为外键。
  3. 现在两个插入都发生在同一个事务中,生成的主键应该在table2中进行修改
  4. 让我们展示一下我的尝试

    Base = declarative_base()
    
    class Table1(Base):
        __tablename__ = 'table1'
        table1id= Column(Integer, primary_key=True)
        name = Column(String)
    
    class Table2(Base):
        __tablename__ = 'table2'
        table2id= Column(Integer, ForeignKey('table1.table1id'))
        name = Column(String)
    #
    table1 = Table1(name='abc')
    table2 = Table2(table2id=table1.table1id)
    session.add(table1)
    session.add(table2 )
    session.commit()
    

    当我运行此代码时,table1id在table1中插入为15, 但它在表2中被称为“null”。

1 个答案:

答案 0 :(得分:1)

在Python中创建模型对象时,它尚未刷新到数据库。在串行列的情况下,DB负责生成新值,因此在生成之前它只是None。在声明中

table2 = Table2(table2id=table1.table1id)

您只需阅读None并将其作为关键字参数 table2id 传递。为了获得一个值,您需要flush对数据库的更改,所以您应该稍微重新排序操作:

table1 = Table1(name='abc')
session.add(table1)
# Flush the changes to the DB
session.flush()
table2 = Table2(table2id=table1.table1id)
session.add(table2)
session.commit()

如果您在表1和表2之间定义relationships,或者这实际上是inheritance hierarchy,则SQLAlchemy也可以或多或少自动执行大部分操作。