SQLAlchemy 按字段唯一约束

2024-01-11

我在现场有 UniqueConstraint,但它不允许我添加多个条目(最多两个!)

from sqlalchemy import Column, Integer, String, Boolean, UniqueConstraint

class Cart(SqlAlchemyBase):
    __tablename__ = 'cart'
    __table_args__ = (UniqueConstraint('is_latest'), {})
    sid = Column(Integer, primary_key=True)
    is_latest = Column(Boolean, index=True, nullable=False)
    name = Column(String)

我想支持更多条目,以便一个名称可以有两种变体:

name=foo, is_latest=True
name=foo, is_latest=False
name=bar, is_latest=True
name=bar, is_latest=False

但随后拒绝任何后续尝试写入 name=foo (或 bar)和 is_latest=True


您在这里想要实现的是类型2 缓慢变化的维度 https://en.wikipedia.org/wiki/Slowly_changing_dimension#Type_2:_add_new_row,这是一个已经被广泛讨论的话题,我鼓励你去查一下。

当我看你的桌子时,你似乎使用sid作为代理键,但我看不到什么是自然键以及随着时间的推移会更新什么。

无论如何,有几种方法可以实现 SCD 类型 2 结果,而无需担心您的检查,但我认为最简单的方法是继续使用自然键添加记录,并且在查询时仅选择代理键最高的记录(自动递增整数),此处不需要当前唯一性,因为仅获取最新值。

有一些例子SQLAlchemy 文档中的版本控制行 https://docs.sqlalchemy.org/en/14/orm/examples.html#examples-versioned-rows,但由于网站来来去去,我将在此处放置上述方法的简化草案。

class VersionedItem(Versioned, Base):
    id = Column(Integer, primary_key=True)  # surrogate key
    sku = Column(String, index=True)  # natural key
    price = Column(Integer)  # the value that changes with time

@event.listens_for(Session, "before_flush")
def before_flush(session, flush_context, instances):
    for instance in session.dirty:
        if not (
            isinstance(instance, VersionedItem)
            and session.is_modified(instance)
            and attributes.instance_state(instance).has_identity
        ):
            continue
        make_transient(instance)  # remove db identity from instance
        instance.id = None  # remove surrogate key
        session.add(instance)  # insert instance as new record
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 按字段唯一约束 的相关文章

随机推荐

  • 使用 hciattach 通过 uart 进行蓝牙?

    我在用QN9021SoC工作在controller mode BLE 蓝牙核心规范 v4 0 它支持一些标准HCI命令以及一些供应商特定的命令 我正在尝试将其附加到我的ubuntu laptop 我使用的命令是hciattach hciat
  • 通过双击文件将参数传递给 JavaFx 应用程序

    我创建了一个 JavaFX 应用程序 部署了 app 文件 它工作正常 然后 我将操作系统设置为使用我的应用程序打开具有特定扩展名的所有文件 我的问题是 当我双击文件时 我的应用程序打开 但我不知道打开它的文件是哪个 我尝试使用该函数检查应
  • EXCEPTION_ACCESS_VIOLATION (0xc0000005) 来自 JNI 的 JVM?

    我在 vc 中用 JNI 编写了一些本机方法 以便从 java 访问 我的三种方法中有两种工作得很好 没有任何问题 然而 当我在运行时调用我的最后一个方法时 它会导致以下错误消息 A fatal error has been detecte
  • 如何使 GTFS 查询运行得更快?

    我正在尝试使用 GTFS 数据库 即 RATP 为巴黎及其郊区提供的数据库 数据集是huge The stop times表有 1400 万行 这是表架构 https github com mauryquijada gtfs mysql b
  • python 中的范围函数

    for n in range 2 5 for x in range 2 n print n x 输出如下 3 2 4 2 4 3 为什么n的值从3开始而不是从2开始 n三点开始因为range 2 2 是空的 也许你真的想要 for n in
  • iPhone 是否支持传入彩信中的 SMIL?

    在我开发的一项服务中 我向用户发送一条彩信 其中包含 6 个静态顺序的图像 为了正确排序图像并添加格式 我使用了 SMIL 它在多种设备上运行良好 然而 iPhone 似乎根本不识别 SMIL 图像按文件名字母顺序排序 更糟糕的是 它们不是
  • 如何向独立的异步任务添加进度条?

    我有一个处于其自己的活动中的异步任务 我向它传递一个字符串值 它连接到我的 Web 服务并根据我传入的名称下载 Json 数据 返回 Json 结果集 效果很好 我想向异步任务添加一个进度旋转器 但我不知道如何做到这一点 我已经仔细阅读了这
  • 属性检测:使用“in”与尝试访问属性

    不得不提的是 我了解一点 JavaScript 但还不是很深入 始终认为这是检查对象上的属性是否可用的正确方法 if window console doSomething 昨天我看到了使用这种技术的代码 if console in wind
  • 由于属性名称规范化,AngularJS 链接函数未调用

    我已经按照自定义验证下的文档定义了一个验证器https docs angularjs org guide forms https docs angularjs org guide forms 但由于某种原因link函数没有被调用 我可以看出
  • Grails select 将不会返回正确的数据

    这是一个延续this https stackoverflow com questions 6959777 grails chained drop down问题 我有一个Address包含基本街道地址信息的类 我也有一个User具有属性的类p
  • 复制 SQL 表中的 3B 行?

    我必须复制一个表 该表在同一数据库中有大约 3B 行 没有 TEXT NTEXT 或其他 LOB 列 最大限度减少停机时间的最快方法是什么 我尝试过 bcp 导入 导出和 SELECT INTO 我收集了每个项目的时间统计数据 它至少需要
  • Rails 请求伪造保护设置

    请帮助 Rails 新手 我有protect from forgery调用 默认情况下给出 我的中没有属性ApplicationController class 基本上这是代码 class ApplicationController lt
  • 如何用vue js绑定组件?

    我有表单和选择组件 事实上事情很简单 我需要两个绑定模型 父组件 Vue component some form template some form data function return countryNameParent 带有项目的
  • 了解 WebRTC 中的 SFU、TURN 服务器

    如果我正在构建 WebRTC 应用程序并使用选择性转发单元媒体服务器 这是否意味着我不需要 STUN TURN 服务器 据我了解 STUN 服务器用于客户端发现其公共 IP 端口 而 TURN 服务器用于当客户端无法通过 STUN 直接相互
  • 将值数组插入 SQL Server 中表的列中

    我有一个数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 我想将这个值数组插入到表中 例如 Column1 Column2 Column3 Column4 1 2 3 4 5 6 7 8 9 10 11 1
  • 如何在 Windows 中的特定显示器上打开窗口?

    我的任务是修改我们的一款 C 产品 以便在 Windows 操作系统的特定显示器上生成一个新窗口 这适用于需要能够配置平铺多显示器可视化的客户 其中每个显示器由单台计算机上的单独显卡驱动 在 Linux 中 我可以通过在每个显示器上启动 X
  • Vue DOM 对计算属性没有反应

    我有一个按钮 如果计算属性的有效属性为 false 则该按钮设置为禁用 如果为 true 则应启用该按钮并允许用户移至当前流程中的下一步 我的 currentStep 计算属性正在根据当前步骤输入的更改完美更新 但按钮 disabled c
  • 摘自 Django 1.5 中的 QueryDict/json

    From self request body I have changes 5B0 5D 5B 5D 1 changes 5B0 5D 5B 5D query changes 5B0 5D 5B 5D first changes 5B0 5
  • 如何使用 spring-data-elasticsearch 在 elasticsearch 中进行集成测试?

    我正在使用 spring data elasticsearch v3 2 4 RELEASE 它可以通过 spring boot starter data elasticsearch v2 2 4 RELEASE 获得 我想为此进行集成测试
  • SQLAlchemy 按字段唯一约束

    我在现场有 UniqueConstraint 但它不允许我添加多个条目 最多两个 from sqlalchemy import Column Integer String Boolean UniqueConstraint class Car