sqlalchemy 唯一约束 VS 索引(unique=True)

2024-03-11

我正在使用 MySQL(运行 InnoDB),并使用 sqlalchemy 包装整个内容。现在,我想使用(请参阅docs http://sqlalchemy-utils.readthedocs.io/en/latest/database_helpers.html)

sqlalchemy_utils.functions.create_database(...)

一般来说,上面的函数会完成它应该做的事情。唯一的例外是唯一索引的生成。

比如说,我定义了一个这样的表:

## ...
# DeclBase = declarative_base()
## ...
class MyTable(DeclBase):
    __tablename__ = 'my_table'

    id = Column(Integer, primary_key=True)
    attr_1 = Column(String(32))
    attr_2 = Column(Integer, nullable=False)
    attr_3 = Column(DateTime)
    attr_4 = Column(
        Integer,
        ForeignKey('other_table.id', onupdate='CASCADE', ondelete='CASCADE'),
        nullable=False
    )

    u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')

当我调用 create_database 时,我将让 sqlalchemy 创建包含指定所有列的表“my_table”。外键也设置得很好,但是在数据库端找不到唯一索引。然后我尝试使用 Index(unique=True) 代替。所以而不是

u_idx = UniqueConstraint(attr_2, attr_3, 'my_table_uidx')

I put

u_idx_1 = Index('my_table_uidx', attr_2, attr_3, unique=True)

我的印象是,这在逻辑上会产生类似的结果。这次 sqlalchemy 确实在数据库上创建了唯一索引。

也许我严重误解了 UniqueConstraint 和 Index(unique=True) 之间的区别,或者 sqlalchemy 使用它们自动生成数据库的方式。

有人能解释一下吗?


主要区别在于,虽然Index API http://docs.sqlalchemy.org/en/latest/core/constraints.html#index-api允许在表定义之外定义索引,只要它可以通过传递的 SQL 结构引用该表即可UniqueConstraint http://docs.sqlalchemy.org/en/latest/core/constraints.html#unique-constraint和一般限制必须在表定义中内联定义 http://docs.sqlalchemy.org/en/latest/core/constraints.html#setting-up-constraints-when-using-the-declarative-orm-extension:

应用表级约束对象,例如ForeignKeyConstraint对于使用声明式定义的表,请使用__table_args__属性,描述于表配置 http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/table_config.html#declarative-table-args.

需要理解的是,在构造声明类的过程中,一个新的Table被构造,如果没有传递显式的__table__。在您的示例模型类中UniqueConstraint实例绑定到类属性,但声明性基础不包括创建的约束Table来自属性的实例。您必须在表参数中传递它:

class MyTable(DeclBase):
    __tablename__ = 'my_table'
    ...
    # A positional argument tuple, passed to Table constructor
    __table_args__ = (
        UniqueConstraint(attr_2, attr_3, name='my_table_uidx'),
    )

请注意,您必须将约束名称作为关键字参数传递。您还可以使用传递约束Table.append_constraint() http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.append_constraint,如果在尝试创建表之前调用:

class MyTable(DeclBase):
    ...

MyTable.__table__.append_constraint(
    UniqueConstraint('attr_2', 'attr_3', name='my_table_uidx'))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sqlalchemy 唯一约束 VS 索引(unique=True) 的相关文章

  • 计算熊猫数据帧几个月的总和

    我有一个 pandas 数据框 如下所示 ID Year R1 R1 f KAR1 20201001 1 5 KAR1 20201101 2 6 KAR1 20201201 3 7 KAR1 20210101 4 8 KAR1 202102
  • PostgreSQL 如何创建数据库或模式的副本?

    有没有一种简单的方法可以在 PostgreSQL 8 1 中创建数据库或模式的副本 我正在测试一些软件 它对数据库中的特定模式进行大量更新 我想复制它 以便我可以与原始版本进行一些比较 如果它位于同一服务器上 则只需使用带有 TEMPLAT
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 如何调试 numpy 掩码

    这个问题与this one https stackoverflow com q 73672739 11004423 我有一个正在尝试矢量化的函数 这是原来的函数 def aspect good angle float planet1 goo
  • 如何在 numpy 数组中查找并保存重复的行?

    我有一个数组 例如 Array 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 2 2 2 我想要输出以下内容的东西 Repeated 1 1 1 2 2 2 保留重复行的数量也可以 例如 Repeated 1 1
  • 如果另一列中的值为空,则删除重复项 - Pandas

    我拥有的 df Name Vehicle Dave Car Mark Bike Steve Car Dave Steve 我想从 名称 列中删除重复项 但前提是 车辆 列中的相应值为空 我知道我可以使用 df dropduplicates
  • 如何在 MySQL Insert 语句中添加 where 子句?

    这不起作用 INSERT INTO users username password VALUES Jack 123 WHERE id 1 有什么想法如何通过 id 将插入范围缩小到特定行吗 在插入语句中 您不会有现有行来执行 where 语
  • 从字典中绘制直方图

    我创建了一个dictionary计算 a 中出现的次数list每个键的内容 我现在想绘制其内容的直方图 这是我想要绘制的字典的内容 1 27 34 1 3 72 4 62 5 33 6 36 7 20 8 12 9 9 10 6 11 5
  • 获取 int() 参数必须是字符串或数字,而不是“Column”- Apache Spark

    如果我使用以下代码 我会收到此异常 int argument must be a string or a number not Column df df withColumn FY F when df ID substr 5 2 isin
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • 导入目录下的所有模块

    有没有办法导入当前目录中的所有模块 并返回它们的列表 例如 对于包含以下内容的目录 mod py mod2 py mod3 py 它会给你
  • 数据库中的持久日期不等于检索日期

    我有一个具有 Date 属性的简单实体类 此属性对应于 MySQL 日期时间列 Entity public class Entity Column name start date Temporal TemporalType TIMESTAM
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • 异步异常处理程序:在事件循环线程停止之前不会被调用

    我正在我的异步事件循环上设置异常处理程序 但是 在事件循环线程停止之前 它似乎不会被调用 例如 考虑以下代码 def exception handler loop context print Exception handler called
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看
  • 为什么我的 PyGame 应用程序根本不运行?

    我有一个简单的 Pygame 程序 usr bin env python import pygame from pygame locals import pygame init win pygame display set mode 400
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d

随机推荐

  • 如何获得两个范围的重叠范围

    我在区间 1 15 中有以下范围 我想找到人 1 和人 2 之间的重叠范围 人物 1 1 3 5 10 人物 2 2 4 8 15 这里我应该得到一个范围列表 其中 2 3 8 10 到目前为止我发现的是先按 person1 的范围循环 然
  • Where 子句中的 SQL Row_Number() 函数

    我发现一个问题的答案是Row Number where 子句中的函数 当我尝试一个查询时 我收到以下错误 消息 4108 级别 15 状态 1 第 1 行 窗口函数只能出现在 SELECT 或 ORDER BY 子句中 这是我尝试过的查询
  • Laravel - php artisan view:clear 有什么作用?

    我运行一个命令php artisan view clear 正如我遵循 Laravel 中自定义 404 页面的教程一样 正如所解释的 该命令清除所有编译的视图文件 进一步我在 laravel 文档中查找它 它说它从视图文件中删除缓存 我问
  • 在 kohana v3 中显示“闪现消息”的最佳方式是什么?

    我想知道最好的展示方式闪讯在 Kohana v3 中 一些教程或示例会很有帮助 你的意思是像 Kohana 2 x 的 flash 会话变量吗 最新的 Kohana 支持get once https github com kohana co
  • 无法从程序集“mscorlib”加载类型“System.Security.Principal.WindowsImpersonationContext”

    我正在创建一个 ASP NET API Core 应用程序来处理与 Oracle 数据库通信的 API 服务 在运行时 当进程尝试通过 DbContext 实体框架 使用新的 Oracle 连接连接到数据库时 会出现未处理的错误并强制应用程
  • SQL 数据读取器 - 处理空列值

    我正在使用 SQLdatareader 从数据库构建 POCO 除非在数据库中遇到空值 否则该代码将正常工作 例如 如果数据库中的 FirstName 列包含空值 则会引发异常 employee FirstName sqlreader Ge
  • 部署网站时缺少 using 指令或程序集引用错误

    我有一个网站 其中 cs 文件位于 App Code 文件夹中 在我的项目中添加类项时 VS2010 建议我创建此文件夹 我有一个使用此类的 default aspx cs 文件 我在VS2010上运行没有任何错误 但是 当我通过私人托管公
  • 找到重复元素异或运算符数组中的两个非重复元素?

    假设我有一个包含 2n 2 个元素的数组 数组中的 n 个元素出现了两次 其余两个元素是唯一的 你必须在 O n 时间和 O 1 空间内解决这个问题 解决方案之一是使用 XOR 但我无法理解这一点 任何人都可以帮助我解决这个问题或者可以给我
  • 更改声音文件的速度

    我正在寻找改变声音文件的速度 但不知道如何实现它 我假设在减慢速度的情况下必须进行某种类型的插值 但不确定如何实现加速 也许是几个样本的平均值 无论是改变节奏还是音调 目前并不重要 我想学习如何实现这两者 但至少想先完成其中一个 如果有人对
  • 如何更改32位寄存器的特定位而不更改其他位?

    我想直接使用寄存器的物理地址来操作寄存器的某些位 但是我找不到方法来做到这一点 我看到一些关于设置位掩码的帖子 但我发现它们太令人困惑了 我的寄存器物理地址是 0x4A10005C 我想操纵它的 18 16 位之间的位 我想设置0x3在那些
  • 这个模板语法“typename = T”是什么意思?

    有时我会看到这样的语法 template
  • 如何使用 PAC(代理自动配置)通过 Fiddler 调试 Htmlunit 流量

    我有一个使用 Htmlunit 的应用程序 需要放置 Fiddler 来拦截流量 我读了一些有关通过附带的 PAC 代理自动配置 javascript 文件配置它的内容 但我无法再次找到该文章 如何通过 PAC 配置 Htmlunit PA
  • 为什么声明字符串时不需要分配内存[重复]

    这个问题在这里已经有答案了 我是 C 新手 目前我正在尝试了解指针是如何工作的 这是一个让我困惑的问题 据我所知 在给指针赋值之前 应该为该指针分配一定的内存 如果我错了 请纠正我 如下面的代码 int main void int i in
  • 从 Haskell 列表中删除重复元素

    我是 Haskell 的初学者 我只是想知道如何实现一个函数来从数组中删除重复元素 例如 1 1 1 3 4 2 2 3 结果应为 1 3 4 2 我不想使用一些现有的函数 例如 element 并通过使用递归来实现它 我的想法是比较 x
  • 调暗屏幕的正确方法是什么?

    到目前为止 我在搜索中看到了两种方法 这两种方法我都遇到了麻烦 方法一 Settings System putInt getContentResolver Settings System SCREEN BRIGHTNESS 100 方法2
  • 我应该使用 ASP.NET 会话还是避免使用它们,为什么?

    我应该使用 ASP NET 会话还是避免使用它们 为什么 对于新的应用程序 我试着避开他们 https stackoverflow com questions 526697 upgrade from net 3 0 to 3 5 sites
  • DirectX 与 VB.NET

    是否有一组有关 DirectX 9 或更高版本 的文档 其中显示了将 DirectX 9 或更高版本 与 VB NET 一起使用的对象 方法 属性 事件和示例代码 最新的 SDK 包含 C 的详细信息 而 Windows DiectX 图形
  • 无需任何代码即可在 xml 文件中定义 Tabhost/TabWidget + 内容 - 这可能吗?

    是否可以仅在布局 xml 文件中定义选项卡布局 每次我找到 tabhost 教程时 它都只能与一些额外的 java 代码一起使用 这是我的 test xml 它不显示任何选项卡
  • 创建一个可变的 java.lang.String

    众所周知 JavaStrings 是不可变的 自 java 诞生以来 不可变字符串就是它的一个重要补充 不变性允许快速访问和大量优化 与 C 样式字符串相比 显着减少出错的可能性 并有助于实施安全模型 可以在不使用 hack 的情况下创建一
  • sqlalchemy 唯一约束 VS 索引(unique=True)

    我正在使用 MySQL 运行 InnoDB 并使用 sqlalchemy 包装整个内容 现在 我想使用 请参阅docs http sqlalchemy utils readthedocs io en latest database help