在 SQLAlchemy 中保存复杂对象

Saving complex objects in SQLAlchemy

我是 SQLAlchemy 的新手,我正在尝试使用 Flask-RESTful 和 Flask- 创建一个包含多个子项列表(简单的一对多关系)的新项SQL炼金术。我正在尝试同时创建项目和子项目,但我不清楚 SQLAlchemy 应该如何工作。

class ItemModel(Model):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True)
    name = Column(String(80))
    sub_items = relationship('SubItemModel')

class SubItemModel(db.Model):
    __tablename__ = 'sub_items'

    id = Column(Integer, primary_key=True)
    item_id = Column(Integer, ForeignKey('items.id'))
    name = Column(String(80))
    item = relationship('ItemModel')

我想添加一个 item 和几个 sub_items(通过 POST 路线),但我无法确定要先创建哪些对象,然后SQLAlchemy 会自动执行多少。通过创建没有 sub_itemsitem,创建 sub_items,然后使用 sub_items 重新保存 item,我得到了一些工作。但这看起来很笨拙,特别是在 item 或某些 sub_items 可能已经存在的情况下。

我的直觉就是做这样的事情:

item = ItemModel(
    name="item1",
    sub_items=[{name: "subitem1"},{name: "subitem2"}])

session.add(self)
session.commit()

但它不起作用(我收到有关不可散列类型的错误),而且它似乎...以某种方式太简单了。就像我应该单独定义 sub_item 对象一样。但是因为它们依赖于 item_id 我不知道该怎么做。

我确信这已经在某个地方得到了回答或在简单的教程中进行了解释,但我还没有找到足够简单的东西让我理解。我希望有人可以引导我完成基础知识。 (哪些部分应该是神奇的,哪些部分我仍然必须手动编码...)

谢谢。

任何 SQLAlchemy 关系的 "many" 端的行为类似于标准 Python 列表。您应该直接创建 SubItemModel 对象并将它们附加到 ItemModel:

item = ItemModel(name='item1')
subitem1 = SubItemModel(name='subitem1')
subitem2 = SubItemModel(name='subitem2')
item.sub_items.append(subitem1)
item.sub_items.append(subitem2)

或者,要一次附加多个项目,您可以使用标准列表 extend 方法:

item = ItemModel(name='item1')
subitem1 = SubItemModel(name='subitem1')
subitem2 = SubItemModel(name='subitem2')
item.sub_items.extend([subitem1, subitem2])

如果需要,您可以在添加子项时直接创建子项:

item = ItemModel(name='item1')
item.sub_items.extend([SubItemModel(name='subitem1'), SubItemModel(name='subitem2')])

无论您选择哪个选项,您都应该将创建的 item 对象添加到会话中,这将自动包含您创建的新子记录:

session.add(item)
session.commit()

瞧,您的项目和子项目应该立即全部插入到数据库中。