her*_*ira 3 referential-integrity sqlalchemy
有人可以帮助我了解配置 SQLAlchemy 模型的总体情况,以便在各个级别确保引用完整性吗?
按照引用完整性应该由数据库表达和强制执行的想法,我创建了一个模式(当前在 Postgresql 中),其中包含我认为需要的所有约束,从而为我提供了一个我相信将强制执行引用完整性的数据库。
然后,我开始在该数据库之上构建一个应用程序,在声明模式下使用 SQLAlchemy (0.7)。
经过搜索和阅读后,我了解到我可以配置:
所有这些选项都有默认值。
但我很困惑,我实际上需要对 SQLAlchemy 模型做多少事情,以确保 SQLAlchemy 在会话期间不会与数据库及其约束不同步。
如果我在 SQLAlchemy 中的 Columns() 定义上配置“onupdate”等,我到底能实现什么?
对于级联和passive_delete/passive_update规则,我可以在relationship()上配置。我在这里需要什么,为什么?
或者重新表述我的问题:SQLAlchemy 在多大程度上会意识到数据库模式中配置的约束,以及我必须在多大程度上(以及如何)在我的模型中重复它们?
还有什么我应该注意的吗?:)
SQLAlchemy 从根本上不需要了解有关数据库所具有的约束的任何信息。如果您的数据库具有您想要配置的约束,那么您基本上就完成了 - 数据库不允许您的应用程序执行任何不应该执行的操作。
SQLAlchemy 的一个关键主题是它实际上只做您告诉它的事情。因此,如果您尝试持久保存一个对象 SubWidget(),该对象在数据库中需要引用父 Widget(),在 SQLAlchemy 刷新数据(即发出 INSERT 语句)时,该操作将失败数据库发出约束违规,事务将回滚。
因此,假设“subwidget”上的 FK 引用“widget”,您的应用程序需要确保数据的结构正确。有两种方法可以做到这一点; 一是您手动维护那些包含外键引用的列,并确保它们在 INSERT 或 UPDATE 时具有适当的值。另一个是您用来relationship()管理外键属性,并且您需要确保 SubWidget() 对象的创建伴随着将其与您创建的父 Widget() 对象关联的操作和/或单独获得。
关于级联,在适用的外键上使用 ON DELETE CASCADE 是一个好主意,尽管不是必需的。在 SQLAlchemy 方面,使用时relationship()您通常希望给 ORM 一个提示,即数据库将通过 Passive_deletes 标志进行级联删除(http://www.sqlalchemy.org/docs/orm/collections.html?highlight=passive_deletes#using -passive-deletes),但这通常是性能增强;否则,SQLAlchemy 确保将依赖端表示的所有对象relationship()加载到内存中并进行适当处理,这意味着要么将外键属性设置为 NULL(默认值),要么将依赖对象标记为删除(这通过以下方式发生)将“cascade”设置为“all,delete-orphan”,请参阅http://www.sqlalchemy.org/docs/orm/session.html#cascades)。
ON UPDATE 级联不太常见,因为自然主键如今已不常见,因为它们实际上的性能不如普通整数主键,并且在其他方面也可能很麻烦。SQLAlchemy 也支持这些,但是它们通常会自行处理,因为 SQLA 默认情况下假设发生 PK 突变时会进行级联更新,请参阅http://www.sqlalchemy.org/docs/orm/relationships .html#mutable-primary-keys-update-cascades有关详细说明。
也许通过一些实验就可以更轻松地理解,基本思想是 SQLAlchemy 只发出您告诉它的 SQL,尽管它的许多 SQL 行为一旦预先配置就会自动执行。 relationship()应该配置有关在根据数据库中存在的约束保留、修改或删除数据时您希望它如何表现的详细信息。
| 归档时间: |
|
| 查看次数: |
1587 次 |
| 最近记录: |