如何在 SQLAlchemy 中正确添加数据?

Posted

技术标签:

【中文标题】如何在 SQLAlchemy 中正确添加数据?【英文标题】:How do I properly add data in SQLAlchemy? 【发布时间】:2015-06-07 21:19:13 【问题描述】:

我正在尝试在 SQLAlchemy 中将数据插入到我的数据库中。我已经以SQLAlchemy documentation suggests的方式建立了多对多关系:

association_table = Table('association', Base.metadata,
            Column('order_id', Integer, ForeignKey('order.id')),
            Column('product_id', Integer, ForeignKey('product.id')),
            PrimaryKeyConstraint('order_id', 'product_id'))

class Order(Base):
    __tablename__ = 'order'
    id      = Column(Integer, primary_key=True)
    date    = Column(Date(timezone=False))
    product = relationship('Product', secondary=association_table, backref='order')

class Product(Base):
    __tablename__ = 'product'
    id      = Column(Integer, primary_key=True)
    name    = Column(String(80), nullable=False)
    price   = Column(Numeric(2))

如何添加数据以使订单可以包含多个产品并且产品可以包含多个订单(即维护一个正常的多对多连接表)? 由于orderproduct 两列都有主键,所以我不能做我通常在一对多关系中做的事情,就像

new_entry = Order(date='2015-06-17', product=Product(id=17, 'hardware', 12.15))
session.add(new_entry)
session.commit()

【问题讨论】:

我认为你应该能够做到Product.order.append(order)。我建议将backref 命名为orders,并将relationship 命名为products @adarsh:我无法让Product.order.append(order) 中的append() 方法工作——除非你想进一步解释你的答案。 使用您的模型(问题中的模型),您应该能够执行以下操作:new_entry = Order(date=..., product=[Product(...), ...])。重要的是要注意order.productproduct.order 关系都与一个列表。这就是为什么@adarsh 建议将它们重命名为productsorders。在您的情况下,您确实不需要关联表,因为它不存储任何其他数据。 【参考方案1】:

我能够通过设置Association Object 而不是使用链接表来插入新数据。所以设置是这样的:

class AssociationTable(Base):
    __tablename__ = 'associationtable'
    product_id = Column(Integer, ForeignKey('product.id'))
    order_id = Column(Integer, ForeignKey('order.id'))
    product = relationship('Product', backref='parent_assocs')
    __table_args__ = (PrimaryKeyConstraint(product_id, order_id), )

class Order(Base):
    __tablename__ = 'order'
    id      = Column(Integer, primary_key=True)
    date    = Column(Date(timezone=False))
    product = relationship('AssociationTable', backref='parent')

class Product(Base):
    __tablename__ = 'product'
    id      = Column(Integer, primary_key=True)
    name    = Column(String(80), nullable=False)
    price   = Column(Numeric(2))

然后我们可以像往常一样通过session 插入值:

new_entry = AssociationTable(order_id=1, product_id=4)
second_entry = AssociationTable(order_id=1, product_id=8)

session.add(new_entry)
session.add(second_entry)
session.commit()

【讨论】:

以上是关于如何在 SQLAlchemy 中正确添加数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将flask_sqlalchemy orm中的数据添加到WTForm FieldList?

如何避免在 SQLAlchemy - python 的多对多关系表中添加重复项?

有没有办法在烧瓶 sqlalchemy 连接中添加 mySQL 数据库/模式名称

如何将自动过滤器添加到与 SQLAlchemy 的关系中?

如何使用 SQLAlchemy 将新字典添加到字典列表中

如何在 SQLAlchemy 中删除外键约束?