如何防止 sqlalchemy 在 select 上创建事务?

2024-03-14

我的问题:

我有一个包含多行数据的文件。我想要try将每一行插入我的数据库,但是如果any的行有问题,我需要回滚整个套件和 kaboodle。但我想跟踪实际的错误,所以我可以这样说,而不是仅仅死在第一个有错误的记录上:

该文件有 42 个错误。

Line 1 is missing a whirlygig.
Line 2 is a duplicate.
Line 5 is right out.

我尝试执行此操作的方法是使用事务,但我遇到一个问题,SQLAlchemy 在 select 上创建隐式事务,显然我并不真正理解 sqlalchemy 如何使用事务,因为我所做的一切似乎都无法按照我想要的方式工作。这是一些演示我的问题的代码:

import sqlalchemy as sa
import logging
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
l = logging.getLogger('sqlalchemy.engine')
l.setLevel(logging.INFO)
l.addHandler(logging.StreamHandler())

engine = sa.create_engine('YOUR PG CONNECTION HERE')

Session = sessionmaker(bind=engine)
session = Session()
temp_metadata = sa.MetaData(schema='pg_temp')
TempBase = declarative_base(metadata=temp_metadata)


class Whatever(TempBase):
    __tablename__ = 'whatevs'
    id = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True)
    fnord = sa.Column('fnord', sa.String, server_default=sa.schema.FetchedValue())
    quux = sa.Column('quux', sa.String)
    value = sa.Column('value', sa.String)


def insert_some_stuff(session, data):
    value = session.query(Whatever.value).limit(1).scalar()
    session.add(Whatever(quux=data, value='hi'))
    try:
        session.commit()
        errors = 0
    except sa.exc.IntegrityError:
        session.rollback()
        errors = 1
    return errors


with session.begin_nested():
    session.execute('''
        CREATE TABLE pg_temp.whatevs (
            id      serial
          , fnord   text not null default 'fnord'
          , quux    text not null
          , value   text not null
          , CONSTRAINT totally_unique UNIQUE (quux)
        );
        INSERT INTO pg_temp.whatevs (value, quux) VALUES ('something cool', 'fnord');
    ''')
    w = Whatever(value='something cool', quux='herp')
    session.add(w)


errors = 0
for q in ('foo', 'biz', 'bang', 'herp'):
    with session.begin_nested():
        errors += insert_some_stuff(session, q)
for row in session.query(Whatever).all():
    print(row.id, row.fnord, row.value)

我尝试过多种组合session.begin() or .begin(subtransactions=True),但它们要么不起作用,要么看起来很奇怪,因为我正在提交我从未(明确)启动的事务。

我可以阻止 sqlalchemy 在 select 上创建事务吗?或者我在这里遗漏了什么?有更好的方法来实现我想要的吗?


看起来好像begin_nested and with块是要走的路。

begin_nested(),与不常用的方式相同begin()方法... -sqlalchemy 文档 http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html#using-savepoint

这让我相信begin_nested是首选。

def insert_some_stuff(session, data):
    try:
        with session.begin_nested():
            value = session.query(Whatever.value).limit(1).scalar()
            session.add(Whatever(quux=data, value='hi'))
        errors = 0
    except sa.exc.IntegrityError:
        errors = 1

    return errors

通过使用with块,它在提交/回滚方面做了正确的事情™,并且不会回滚太远。

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

如何防止 sqlalchemy 在 select 上创建事务? 的相关文章

  • 通过 boto3 承担 IAM 用户角色时访问被拒绝

    Issue 我有一个 IAM 用户和一个 IAM 角色 我正在尝试将 IAM 用户配置为有权使用 STS 承担 IAM 角色 我不确定为什么收到 访问被拒绝 错误 Details IAM 角色 arn aws iam 123456789 r
  • ValueError:请使用“Layer”实例初始化“TimeDistributed”层

    我正在尝试构建一个可以在音频和视频样本上进行训练的模型 但出现此错误ValueError Please initialize TimeDistributed layer with a Layer instance You passed Te
  • 将 yerr/xerr 绘制为阴影区域而不是误差线

    在 matplotlib 中 如何将误差绘制为阴影区域而不是误差条 例如 而不是 忽略示例图中各点之间的平滑插值 这需要进行一些手动插值 或者只是获得更高分辨率的数据 您可以使用pyplot fill between https matpl
  • Python re无限执行

    我正在尝试执行这段代码 import re pattern r w w s re compiled re compile pattern results re compiled search COPRO HORIZON 2000 HOR p
  • 指示电子邮件的类型

    我有以下自动化程序 它将电子邮件发送给我自己 并添加了特定的链接 import win32com client as win32 import easygui import tkinter as to from tkinter import
  • 将 C++ 指针作为参数传递给 Cython 函数

    cdef extern from Foo h cdef cppclass Bar pass cdef class PyClass cdef Bar bar def cinit self Bar b bar b 这总是会给我类似的东西 Can
  • 从 pyspark.sql 中的列表创建数据框

    我完全陷入了有线的境地 现在我有一个清单li li example data map lambda x get labeled prediction w x collect print li type li 输出就像 0 0 59 0 0
  • 将 pandas 剪切操作转换为常规字符串

    我明白了 pandas cut 操作的输出 0 0 20 1 0 20 2 0 20 3 0 20 4 0 20 5 0 20 6 0 20 7 0 20 8 0 20 9 0 20 如何将 0 20 转换为 0 20 我正在这样做 str
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • python 中的 h2o 框架子集

    如何在 python 中对 h2o 框架进行子集化 如果 x 是一个 df 并且 Origin 是一个变量 那么在 pandas 中我们通常可以通过以下方式进行子集化 x x Origin AAF 但使用 h2o 框架会出现以下错误 H2O
  • 在 Mac OSX 上从 Python 3.6 运行 wine 命令

    我正在尝试用 Python 编写一个打开的脚本wine然后发送代码到wine终端打开一个 exe程序 这 exe程序也是命令驱动的 我可以打开wine 但我无法进一步 import shlex subprocess line usr bin
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • Jupyter 笔记本中未显示绘图图表

    我已经尝试解决这个问题几个小时了 我按照上面的步骤操作情节网站 https plot ly python getting started start plotting online并且图表仍然没有显示在笔记本中 这是我的情节代码 color
  • 如何在 Django Rest 框架中编写“删除”操作的测试

    我正在为 Django Rest Framework API 编写测试 我一直在测试 删除 我对 创建 的测试工作正常 这是我的测试代码 import json from django urls import reverse from re
  • 使用标签或 href 传递 Django 数据

    我有一个包含链接的表 当单击该链接进行更多操作时 我想将一些数据传递给我的函数 my html table tbody for query in queries tr td value a href internal my func que
  • Python 2 的 `exceptions` 模块在 Python3 中丢失了,它的内容到哪里去了?

    一位朋友提到 对于 Python 2 假设您在命令行上的路径环境变量中有它 pydoc exceptions 非常有用 知道它应该可以为他每周节省几分钟的网络查找时间 我自己每周都会用谷歌搜索一次例外层次结构 所以这对我来说也是一个有用的提
  • pygame:使用 sprite.RenderPlain 绘制精灵组的顺序

    我有一个精灵组 需要按一定的顺序绘制 以便其精灵按应有的方式重叠 然而 即使使用运算符模块函数 sorted self sprites key attrgetter y x 对组进行排序 顺序也是错误的 我该如何解决这个问题 直截了当地说
  • 基于值而不是类型的单次调度

    我在 Django 上构建 SPA 并且有一个庞大的功能 其中包含许多功能if用于检查我的对象字段的状态名称的语句 像这样 if self state new do some logic if self state archive do s
  • 根据多个阈值将 SciPy 分层树状图切割成簇

    我想将 SciPy 的树状图切割成多个具有多个阈值的簇 我尝试过使用 fcluster 但它只能削减一个阈值 例如 这是我从另一个问题中摘取的一段代码 import pandas data pandas DataFrame total ru
  • 寻找完美的正方形

    我有这个Python代码 def sqrt x ans 0 if x gt 0 while ans ans lt x ans ans 1 if ans ans x print x is not a perfect square return

随机推荐

  • NOCHECK 不禁用外键引用

    表创建脚本 CREATE TABLE dbo details id int NULL details varchar max NULL CREATE TABLE dbo name id int IDENTITY 1 1 NOT FOR RE
  • 如何自动更新 Subversion 工作副本?

    有谁知道我如何自动运行svn update 如果有人有脚本或类似的东西 你能给我举个例子吗 我正在使用 TortoiseSVN 在生产服务器上 我有一个运行以下批处理文件的计划任务 CD C Program Files TortoiseSV
  • 如何查看 Git 存储中未跟踪的文件

    我经常将我完成的工作隐藏在新的 未跟踪的 文件中 并且我希望以后能够找到这项工作 找到它的明显方法似乎是git show 我刚刚发现Git在我使用时完全省略了这些文件git show 但幸运的是 在弹出隐藏代码时不会忽略它们 这使得似乎不可
  • 在 FFmpeg 中正确分配和填充帧

    我正在填写一个Frame使用 BGR 图像进行编码 但出现内存泄漏 我想我找到了问题的根源 但它似乎是一个库问题 由于 FFmpeg 是一个如此成熟的库 我认为我误用了它 我希望得到指导如何正确地使用它 我正在分配一个Frame using
  • JasperReports 中的印地语字体 [重复]

    这个问题在这里已经有答案了 在印地语字体的内部预览中正确显示 但在 PDF 中情况有所不同 例如 在 Pdf 中显示 怎么解决这个问题 一些字体类型 例如 Arial Unicode MS 将支持特殊字符 例如印地语符号 要解决此问题 请打
  • 如何使用汇编程序从英特尔处理器中获取随机数?

    我需要从处理器 英特尔酷睿 i3 中的英特尔随机生成器获取随机数 我不想使用任何图书馆 我想在 C 中使用汇编程序粘贴 但我不知道应该使用哪些寄存器和指令 呼叫RDRAND支持的 CPU 目前仅 Ivy Bridge 和 Haswell I
  • 如何使用OpenCV找出帧之间的差异?

    在 OpenCV 上运行视频时如何找到帧之间的差异 我需要做一个循环来检查帧与帧之间的更改并将结果显示在另一个窗口中 我可以在此处附加的循环中执行此操作吗 或者还有其他方法可以做到吗 while key x frame cvQueryFra
  • 手动调用 __enter__ 和 __exit__

    我用谷歌搜索过但没有运气 所以让我们想象一下我有MySQL使用的连接器类 enter and exit 函数 最初与with语句 来连接 断开与数据库的连接 让我们有一个使用其中 2 个连接的类 例如用于数据同步 注意 这不是我的现实生活场
  • 如何在 2020/21 年活动中获取 ViewModel 实例?

    我是 mvvm 模式的新手 我为主要活动创建了一个 ViewModel 现在我想在主活动中获取 ViewModel 的实例 Stackoverflow 上的大多数教程和答案都建议使用ViewModelProviders of 但这已被弃用
  • 无法使用 Httprequest 库将图像上传到服务器

    我创建了一个应用程序 用户在其中从图库中选择图像并将该图像上传到服务器 我尝试使用 Httprequest 库执行此操作 但我无法上传它 Code HttpRequest request HttpRequest post https bet
  • Flutter android 版本卡在启动屏幕上

    Flutter android 版本构建卡在启动屏幕上 我尝试过清理项目flutter clean 但它仍然卡在启动屏幕上 我也用过WidgetsFlutterBinding ensureInitialized 在执行之前runApp 它仍
  • 如何在不破坏 Subversion 历史记录的情况下重命名 Java 包?

    我工作的公司正在成立 他们在此过程中更改了名称 所以我们仍然使用包名称 com oldname 因为我们害怕破坏文件更改历史记录 或者版本之间的祖先链接 或者任何我们可能破坏的东西 我不认为我使用了正确的术语 但你明白了这个概念 我们使用
  • 从外部文件获取输入?

    我需要从 C 的外部文件中获取非常基本的输入 我尝试在互联网上搜索几次 但没有任何内容真正适合我的需要 这将是一个输入来自的 txt 文件 其中将填充如下行 131 241 371 481 我已经有代码可以手动获取此输入 它看起来像这样 u
  • GCMIntentService 的 Intent Extras 未传递

    I coded GCMIntentService但打电话Activity无法获得额外费用 Override protected void onMessage Context context Intent intent Intent resu
  • 信息窗口显示在错误的位置

    I have little problem with my webpage When I m trying to show InfoWindow on marker That windows shows on the top left co
  • Google FooBar 挑战显示 Blacklisted_Code 错误 [已关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我今天偶然发现了 Google Foo Bar 挑战 在解决非常简单的第一个问题时 gt 涉及创建字符串中所有素数的串联
  • 不间断睡眠是否是我的Python程序运行速度非常慢的原因(如果是这样,我该如何解决这个问题?)?

    我有以下 select 语句 使用 sqlite3 和 pysqlite 模块 self cursor execute SELECT precursor id FROM MSMS precursor JOIN spectrum ON spe
  • SQL Server 行级安全性 - 多对多

    我们使用 SQL Server 2008 并在 Active Directory AD 中设置权限 核心表中的每一行只能由有权查看每一行的人员查看 我可以在每一行上设置行级安全性 每行包含与 AD 组对齐的单个角色 但是我遇到以下问题 因为
  • 需要单个 SQL 查询[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有两个表如下 companyid name 1 pwc 2 dell 3 microsoft 4 google 5 yahoo 6 tw
  • 如何防止 sqlalchemy 在 select 上创建事务?

    我的问题 我有一个包含多行数据的文件 我想要try将每一行插入我的数据库 但是如果any的行有问题 我需要回滚整个套件和 kaboodle 但我想跟踪实际的错误 所以我可以这样说 而不是仅仅死在第一个有错误的记录上 该文件有 42 个错误