在 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_items
的 item
,创建 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()
瞧,您的项目和子项目应该立即全部插入到数据库中。
我是 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_items
的 item
,创建 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()
瞧,您的项目和子项目应该立即全部插入到数据库中。