这样在插入、更新或删除数据时,MySQL 数据库会自动检查是否符合外键约束条件,从而保证了表之间的数据一致性。...因为外键约束的作用是确保参考表中的某一列值必须存在于当前表的某一列中,所以参考表中的该列必须设置为唯一的且非空。...外键约束:可以确保表中指向其他表的字段只包含该表中存在的值。外键约束还可以防止删除数据时出现意外情况(例如删除了被其他表所引用的数据)。...例如,可以使用检查约束确保一个日期字段始终是当前日期之后的日期。 默认值约束:可以为某个字段指定默认值,在插入数据时如果没有写入该字段,则会自动填充默认值。...因此,在开发中添加MySQL约束名时,请务必确保每个约束名称都与实际存储在数据库中的名称相匹配。此外,应避免使用太长或含义不明的名称,以便在未来快速定位约束问题。
当我们声明相互关联的表时,SQLAlchemy 不仅使用这些外键约束声明在向数据库发送 CREATE 语句时将其发送出去,而且还用于帮助构造 SQL 表达式。...元数据结构也不必包含表、列或其他在本地应用程序中不需要的预先存在数据库中的约束和构造。...当我们声明相互关联的表时,SQLAlchemy 使用这些外键约束声明的存在,不仅在将它们发射到数据库的 CREATE 语句中,还用于辅助构建 SQL 表达式。...当我们声明彼此相关的表时,SQLAlchemy 使用这些外键约束声明的存在不仅使它们在向数据库发送 CREATE 语句时被发射,而且还有助于构建 SQL 表达式。...元数据结构也不必包括表、列或其他在预先存在的数据库中不需要的约束和结构,在本地应用程序中不需要。
下表总结了本文讨论的调用形式: ORM 用例 使用的 DML 构造 使用以下方式传递数据 是否支持 RETURNING? 是否支持多表映射?...操作不提供 Python 中的关系级联功能 - 假定任何需要的外键引用都已配置为 ON UPDATE CASCADE 和/或 ON DELETE CASCADE,否则如果强制执行外键引用,则数据库可能会发出完整性违规...'fetch' - 通过在执行 UPDATE 或 DELETE 之前执行 SELECT 或使用 RETURNING(如果数据库支持)来检索受影响行的主键标识,以便受操作影响的内存对象可以使用新值刷新(更新...'fetch' - 通过在执行 UPDATE 或 DELETE 之前执行 SELECT 或通过使用数据库支持的 RETURNING 来检索受影响行的主键标识,以便可以刷新受操作影响的内存中的对象(更新)...'fetch' - 通过在执行 UPDATE 或 DELETE 之前执行 SELECT 或使用 RETURNING(如果数据库支持),检索受影响行的主键标识,以便可以使用新值刷新受操作影响的内存对象(更新
元数据用作将此表与通过外键引用的其他表关联的关联点。它还可以用于将此表与特定的Connection或Engine关联起来。...注意,这 不会 自动在关系数据库中生成约束,对于已经存在于数据库中的表。要向现有的关系数据库表添加约束,必须使用 SQL ALTER 命令。...元数据用作将此表与其他通过外键引用的表关联的点。它也可以用于将此表与特定的 Connection 或 Engine 关联起来。...通常,表之间的依赖关系是通过外键对象确定的。然而,对于创建外键以外的其他情况(规则、继承),可以手动建立这样的链接。...请注意,这不会自动在关系数据库中生成约束,对于已经存在于数据库中的表。要向现有的关系数据库表添加约束,必须使用 SQL ALTER 命令。
你可以使用主键来查询数据。 外键: 外键用于关联两个表。 复合键: 复合键(组合键)将多个列作为一个索引键,一般用于复合索引。 索引: 使用索引可快速访问数据库表中的特定信息。...无法在record表中插入在student表中不存在的student_id,这个叫外键约束 尝试删除记录: > DELETE FROM record WHERE day='2018-01-01' AND...由于上面建立的2张表建立了外键关联,record表中的student_id一定是在student表中的,所以上面 JOIN 语句使用 LEFT 是不会有更多记录的。...除了最后一句create_all可以不写(写上也没事,这句是创建表,但是表已经存在的情况下,不会创建也不会报错) 暂时不要用中文,使用中文的方法在最后 插入数据: from sqlalchemy import...实际使用的时候,在创建表的时候把类定义好(即使表已经存在也定义一下),其他操作的时候直接import这个类就好了。
Mapper 定义 Python 类与数据库表或其他关系结构之间的关联,以便对该类进行的 ORM 操作可以继续进行。...表示具有一些 NULL 值的复合主键应被视为可能存在于数据库中。这会影响映射器是否将传入的行分配给现有标识,以及 Session.merge() 是否首先检查数据库中特定主键值。...当为True时,假定已在将此映射器的表与其超类表链接的外键关系上配置了 ON DELETE CASCADE,以便当工作单元尝试删除实体时,只需为超类表发出 DELETE 语句,而不是为此表发出 DELETE...如果实例的状态已过期,则调用此方法将导致数据库检查以查看对象是否已被删除。如果行不再存在,则引发ObjectDeletedError。 此值通常也在实例状态下以属性名称键的形式找到。...如果实例的状态已过期,则调用此方法将导致数据库检查以查看对象是否已被删除。如果行不再存在,则会引发ObjectDeletedError。
<options 其他参数: echo是否显示ORM转成实际sql语句的过程,echo=True为显 encoding为连接时使用的字符集 操作: 基本操作: 创建新表 方法一: 使用declarative...插入 数据【这里仅针对使用declarative_base创建的表,对于不是程序中才创建的,可以自己使用declarative_base建一个类来映射之前的表,只要映射一致,就能插入数据】 1.连接数据库...: 外键使用foregin_key创建 类中的relationship的作用:帮助ORM获知他们的外键关系,以便ORM使用外键获取相关数据 relationship中的backref的用途:relationship...,为了避免ORM混淆多个relationship,特别的标注哪个外键是哪个relationship relationship中的secondary的用途:在多对多的关系中,填入的值是中间表,维持两边表关系...:当你建表成功而插入数据失败时,可以尝试先删除掉数据表,有时候因为外键依赖会导致插入失败 #负责导入连接数据库的对象 from sqlalchemy import create_engine from
在典型情况下,使用单个参数字典,新传入的键将替换前一个构造中的相同键。在基于列表的“多值”构造中,每个新的值列表都会被扩展到现有的值列表上。...此 FROM 子句返回的列的顺序应与作为 names 参数发送的列的顺序相对应;虽然在传递给数据库之前不会检查这一点,但如果这些列列表不对应,数据库通常会引发异常。...)中未在名称列表中另行指定的值,以便这些值也包含在要插入的数据中。...从此 FROM 子句返回的列的顺序应与作为names参数发送的列的顺序相对应;虽然在传递给数据库之前不会检查这一点,但如果这些列列表不对应,数据库通常会引发异常。...,以便这些值也包含在要插入的数据中。
使用relationship()映射的属性的访问将尝试使用此Session作为连接源从数据库加载值。值将根据此对象上存在的外键和主键值加载 - 如果不存在,则这些关系将不可用。...当 ORM 正常使用时,Session.enable_relationship_loading()不会改善行为 - 对象引用应该在对象级别而不是在外键级别构建,以便它们在 flush()继续之前以普通方式存在...通过relationship()映射的属性访问将尝试使用此Session作为连接的源来从数据库加载值。这些值将根据此对象上存在的外键和主键值进行加载 - 如果不存在,则这些关系将不可用。...Session.enable_relationship_loading()在正常使用 ORM 时不会改善行为 - 对象引用应该在对象级别构建,而不是在外键级别构建,以便它们在 flush()继续之前以普通方式存在...请注意,高度隔离的事务将返回与之前在同一事务中读取的相同值,而不管事务外数据库状态的更改如何。 要使单个对象及其上的单个属性过期,请使用Session.expire()。
Table对象的应用程序中以及在迁移场景中(尤其是使用 Alembic Migrations 检测新表和外键约束时)引起问题。...此标志指示列是否具有某种数据库端的 “autoincrement” 标志。在 SQLAlchemy 中,其他类型的列也可以充当 “autoincrement” 列,而不一定在它们身上具有这样的标志。...Table对象的应用程序中造成问题,以及在迁移场景中,特别是在使用 Alembic 迁移检测新表和外键约束时。...Table对象的应用程序内以及在迁移方案中引起问题,特别是在使用 Alembic Migrations 检测新表和外键约束时。...此标志指示列是否具有某种数据库端的“自动增量”标志。在 SQLAlchemy 中,其他类型的列也可能充当“自动增量”列,而不一定在其上具有这样的标志。
这是一个不一致性问题,在关系型数据库中通过使用“两阶段事务”解决,它在提交序列中增加了一个额外的“准备”步骤,允许多个数据库在实际完成事务之前同意提交。...SQLite 在将 RETURNING 与触发器组合使用时存在限制,因此 RETURNING 子句将不会包含插入的值 其他后端可能在与触发器一起使用 RETURNING,或者其他类型的服务器生成值时存在限制...include_collections – 表示是否应该包含多值集合在操作中。将其设置为False是一种仅检测基于本地列的属性(即标量列或多对一外键)的方法,这些属性在刷新时会导致此实例的更新。...请注意,高度隔离的事务将返回与之前在同一事务中读取的相同值,而不管该事务之外的数据库状态是否发生变化。 要使单个对象以及这些对象上的单个属性过期,请使用 Session.expire()。...实际上,这是一个更昂贵且更准确的版本,用于检查给定实例是否在Session.dirty集合中;对于每个属性的净“脏”状态进行了全面测试。
这两种用例是: 一个表包含对自身的外键,而且单个行将具有指向其自身主键的外键值。 两个表都包含对另一个表的外键引用,每个表中的一行引用另一个表中的另一行。...对于强制实施引用完整性的数据库,最佳策略是使用数据库的ON UPDATE CASCADE功能,以便将主键更改传播到引用的外键 - 在事务完成之前,值不能不同步,除非约束标记为“可延迟”。...对于强制执行引用完整性的数据库,最佳策略是使用数据库的 ON UPDATE CASCADE 功能,以便将主键更改传播到引用的外键 - 除非约束被标记为“可延迟”,即不执行直到事务完成,否则值不能在任何时刻不同步...模拟无外键支持的有限 ON UPDATE CASCADE 在使用不支持引用完整性的数据库且存在可变值的自然主键的情况下,SQLAlchemy 提供了一种功能,允许在已经引用了外键的情况下将主键值传播到一个有限程度...relationship.load_on_pending标志在 ORM 正常使用时不会改善行为 - 对象引用应在对象级别构造,而不是在外键级别构造,以便它们在刷新进行之前以普通方式存在。
在ForeignKey约束上配置ondelete="cascade"。这也在使用 ORM 关系进行外键级联删除中详细说明。...,直到下一次刷新,在此刻它们将被插入到数据库中,假设添加的对象之前是瞬态的。...Session 内部保持在挂起队列中,直到下一次刷新,在此时它们被插入到数据库中,假设添加的对象之前是瞬态的。...中被保留在待处理队列中,直到下一个 flush,此时它们被插入到数据库中,假设添加的对象之前是瞬态的。...“UPDATE…FROM”语法,在 SQLite 和其他支持的数据库中,在 WHERE 子句中命名附加的audit_transaction表。
这种方法绕过了标准的引用完整性实践,因为“外键”列实际上不被约束以引用任何特定的表;相反,在应用程序逻辑中使用逻辑来确定引用的是哪个表。...关联表包含一个“鉴别器”列,用于确定每个关联表中的行与哪种类型的父对象相关联。 generic_fk.py - 展示了所谓的“通用外键”,类似于流行框架(如 Django、ROR 等)的做法。...这种方法绕过了标准的参照完整性实践,因为“外键”列实际上并没有约束到任何特定的表;相反,应用程序逻辑用于确定引用的是哪个表。...关联表包含一个“区分符”列,用于确定哪种类型的父对象与关联表中的每个特定行关联。 generic_fk.py - 演示了所谓的“通用外键”,类似于流行框架(如 Django,ROR 等)的方式。...演示将为数据文件创建一个本地目录,插入初始数据,然后运行。第二次运行演示将利用已经存在的缓存文件,并且只会发出一条 SQL 语句针对两个表 - 但显示的结果将利用数十个从缓存中获取的延迟加载。
在典型情况下,这些类不包含对引擎、会话或表达式构造的引用,因此可以直接序列化。 完全从序列化结构加载的表元数据(即在应用程序中尚未声明的元数据)。...序列化器模块专门用于相反的情况,即表元数据已经存在于内存中的情况。...在创建此键之前,访问者应首先检查“_annotations”字典是否为非 None。 attribute dp_anon_name = 'AN' 访问可能“匿名化”的字符串值。...例如,表名和列名,绑定参数键,特殊关键字如“UNION”,“UNION ALL”。 字符串值被认为在缓存键生成中是重要的。...SQLAlchemy 查询和对象映射操作的核心由 数据库元数据 支持,它由描述表和其他模式级对象的 Python 对象组成。
处理多个连接路径 处理的最常见情况之一是两个表之间存在多个外键路径时。...当存在显式连接条件时,这些函数可能更加简洁,并且还标记了“外键”或“远程”列的确切位置,无论该列是否多次声明或在复杂的 SQL 表达式中声明: from sqlalchemy.orm import foreign...使用自定义表达式意味着我们可以生成不遵循通常的主键/外键模型的非正统连接条件。其中一个例子是实现路径模式,其中我们比较字符串以产生重叠路径标记,以便生成树结构。...重叠的外键 很少见的情况可能会出现,即使用复合外键,以便单个列可能是通过外键约束引用的多个列的主题。...使用自定义表达式意味着我们可以生成不遵循通常的主键/外键模型的非正统连接条件。其中一个例子是材料化路径模式,我们在比较字符串以产生重叠路径标记时,以便生成树结构。
使用 ORM 关系的外键 ON DELETE 级联 使用外键 ON DELETE 与多对多关系 删除孤儿 合并 刷新过期 清除 关于删除 - 删除从集合和标量关系引用的对象的注意事项...通过事件跟踪事务状态 将会话加入外部事务(例如用于测试套件) 其他持久化技术 将 SQL 插入/更新表达式嵌入到刷新中 在会话中使用 SQL 表达式 强制将具有默认值的列设置为...当相关对象包含指向要删除对象的外键约束,并且它们所属的相关集合目前未加载到内存中时,工作单元将发出 SELECT 语句以获取所有相关行,以便它们的主键值可用于发出这些相关行的 UPDATE 或 DELETE...如果存在,则尝试在本地标识映射中定位该实例。如果 load=True 标志保持默认设置,则还会检查数据库是否存在此主键,如果在本地找不到,则检查数据库是否存在此主键。...大多数Session.merge()问题可以通过首先检查 - 对象是否过早地在会话中?
在一对多关系中,要在多这一侧加入一个外键,指向一这一侧联接的记录,即relationship()声明出现在代表少那个类,而外键声明出现在代表多的那个类中。...address表中的外键连接了两行。...如果无法决定外键,你就要为db.relationship()提供额外参数,从而确定所用外键,常用的配置选项如下所示: backref:在关系的另一个模型中添加反向引用 primary join:明确指定两个模型之间使用的联结条件...自引用关系 多对多关系在我们的Web应用中可以用来实现用户之间的关注,但是在上面的文章和标签的例子中,关联表连接的是两个明确的实体,而在用户关注其他用户时,都在users表内,只有一个实体。...这种信息只能存储在关联表中,但是在之前实现的学生和课程之间的关系中,关联表完全是由SQLAlchemy掌控的内部表。
插件将在调用 .prepare() 的目标的子类树中搜索,并反射所有由声明类命名的表;目标数据库中不属于映射的表,且不通过外键约束与目标表相关的表将不会被反射。...插件将在调用.prepare()的目标的子类树中搜索,并反射所有由声明的类命名的表;不是映射的目标数据库中的表,也不是通过外键约束与目标表相关联的表将不被反射。...在需要映射的反射表不包含主键约束的情况下,以及在映射对任意可选择内容的情况下,主键列可能不存在的一般情况下,提供了 Mapper.primary_key 参数,以便将任何一组列配置为表的“主键”,就 ORM...插件将针对调用 .prepare() 的目标的子类树中搜索,并反射所有由声明类命名的表;不属于映射的目标数据库中的表,也不通过外键约束与目标表相关联的表将不被反射。...插件将针对调用 .prepare() 的目标的子类树中搜索,并反射所有由声明类命名的表;不属于映射的目标数据库中的表,也不通过外键约束与目标表相关联的表将不被反射。
这要求我们在 VALUES 子句中引用Table对象,以便引用其他表: >>> update_stmt = ( ......类的实例代表行 在前面的示例中,我们使用 Python 字典发出了一个 INSERT,以指示我们想要添加的数据,而使用 ORM 时,我们直接使用了我们定义的自定义 Python 类,在使用 ORM 声明式表单定义表元数据回到之前...这是可能的,因为User类包含了一个由 ORM 映射提供的自动生成的__init__()构造函数,以便我们可以使用列名作为构造函数中的键来创建每个对象。...另请参阅 delete - 描述了如何调整 Session.delete() 的行为,以便处理其他表中相关行的方式。...使用一些复杂的语法将行插入到user_account和address表中,以便自动将address.user_id列与user_account行的列关联起来。
领取专属 10元无门槛券
手把手带您无忧上云