添加 prefix_with 子句以插入特定类

2024-07-04

我怎样才能定制prefix_withSQLAlchemy 中的每个模型类,以便每个模型类都可以有不同的插入语句?

我其实想要OR IGNORE子句添加到某些类中。

PS:我对 SQLAlchemy 比较陌生


ORM 没有挂钩它的生成方式insert()构造,所以你在这里能做的最好的事情就是拦截insert()的声明Tablelevel,这可能已经足够好了,因为您想对这些表进行全面的“忽略”操作,这里有一个使用类装饰器使其通用的方法。我们正在利用执行前 http://docs.sqlalchemy.org/en/rel_0_8/core/events.html#sqlalchemy.events.ConnectionEvents.before_execute这里的事件重写某些insert()结构体:

from sqlalchemy import event
from sqlalchemy.engine import Engine
from sqlalchemy.sql import Insert

_ignore_tables = set()

@event.listens_for(Engine, "before_execute", retval=True)
def _ignore_insert(conn, element, multiparams, params):
    if isinstance(element, Insert) and \
        element.table.name in _ignore_tables:
        element = element.prefix_with("IGNORE")
    return element, multiparams, params

def ignore_inserts(cls):
    _ignore_tables.add(cls.__table__.name)
    return cls

if __name__ == '__main__':
    from sqlalchemy import Column, Integer, create_engine
    from sqlalchemy.orm import Session
    from sqlalchemy.ext.declarative import declarative_base

    Base = declarative_base()

    class A(Base):
        __tablename__ = 'a'

        id = Column(Integer, primary_key=True)

    @ignore_inserts
    class B(Base):
        __tablename__ = 'b'

        id = Column(Integer, primary_key=True)

    @ignore_inserts
    class C(Base):
        __tablename__ = 'c'

        id = Column(Integer, primary_key=True)

    e = create_engine("mysql://scott:tiger@localhost/test", echo=True)
    Base.metadata.drop_all(e)
    Base.metadata.create_all(e)

    s = Session(e)

    s.add_all([A(), B(), C()])
    s.commit()

像这样全面使用它会让我紧张,这里有一个不同的版本,以便您可以使用上下文管理器为具有特定内容的特定表设置规则Session:

from sqlalchemy import event
from sqlalchemy.engine import Engine
from sqlalchemy.sql import Insert
from contextlib import contextmanager

@event.listens_for(Engine, "before_execute", retval=True)
def _ignore_insert(conn, element, multiparams, params):
    if isinstance(element, Insert) and \
        'ignore_tables' in conn.info and \
        element.table.name in conn.info['ignore_tables']:
        element = element.prefix_with("IGNORE")
    return element, multiparams, params


@contextmanager
def ignore_inserts(session, names):
    conn = session.connection()
    info = conn.info   # hold onto info so we can still
                       # get to it when the Connection is closed
    previous = info.get('ignore_tables', ())
    try:
        info['ignore_tables'] = set(names)
        yield
    finally:
        info['ignore_tables'] = previous

if __name__ == '__main__':
    from sqlalchemy import Column, Integer, create_engine
    from sqlalchemy.orm import Session
    from sqlalchemy.ext.declarative import declarative_base

    Base = declarative_base()

    class A(Base):
        __tablename__ = 'a'

        id = Column(Integer, primary_key=True)

    class B(Base):
        __tablename__ = 'b'

        id = Column(Integer, primary_key=True)

    class C(Base):
        __tablename__ = 'c'

        id = Column(Integer, primary_key=True)

    e = create_engine("mysql://scott:tiger@localhost/test", echo=True)
    Base.metadata.drop_all(e)
    Base.metadata.create_all(e)

    s = Session(e)

    with ignore_inserts(s, ['b']):
        s.add_all([A(), B(), C()])
        s.commit()

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

添加 prefix_with 子句以插入特定类 的相关文章

  • 重复 for 循环的迭代

    如果出于某种原因我想重复相同的迭代 我该如何在 python 中做到这一点 for eachId in listOfIds assume here that eachId conatins 10 response makeRequest e
  • 在 Python 中运行 Bash 命令

    在我的本地计算机上 我运行一个包含此行的 python 脚本 bashCommand cwm rdf test rdf ntriples gt test nt os system bashCommand 这很好用 然后我在服务器上运行相同的
  • 使用 Matplotlib 创建箱线图

    我正在使用 python 3 和 jupyter 笔记本 我有一个 pandas 数据框 其结构如下 location price Apr 25 ASHEVILLE 15 0 Apr 25 ASHEVILLE 45 0 Apr 25 ASH
  • pandas 预期第 153 行有 10 个字段,看到 11 个字段,如何再添加一列

    我有一个 info txt 文件 它看起来像这样 B 19960331 00100000 00000000000000 00000000000000 00000000000000 00000000 00000000000000 000000
  • 如何在 Python 3 中使用 smtplib.sendmail() 对收件人姓名(而不是地址)中的国际字符进行编码?

    我在 Python 3 程序中使用标准 smtplib sendmail 调用来发送电子邮件 如下所示 smtp session sendmail The Sender lt email protected cdn cgi l email
  • Kivy:如何在树视图中使用 on_key_down 和 on_key_up 键盘事件?

    我在用python 2 7 and kivy 1 10 0 当我点击nameTextInput 然后树视图显示 我希望选择标签up and down键 并且当enter按下键 文本被复制 所选文本被复制到初始表单 就像您单击该项目时当前完成
  • 为什么“linkClicked(const QUrl&)”信号没有捕获鼠标左键的 QUrl?

    首先 我想澄清的是 这种奇怪的行为并不适用于每个网站 这是我的代码网页浏览器 https github com EricsonWillians Open Browser def compose tab self index self tab
  • 熊猫读_csv。如何忽略换行符之前的分隔符

    我正在读取一个包含数值的文件 data pd read csv data dat sep header None 在文本文件中 每行以空格结尾 因此 pandas 等待不存在的值 并在每行末尾添加一个 nan 例如 2 343 4 234
  • Pandas:处理测试中看不见的数据

    我有一个训练数据集 正在构建一些机器学习模型 我无权访问测试集 并且想要处理在训练中未观察到测试中的分类特征之一的可能性 这是一个玩具示例 说明了我的意思 我有一个数据框 old 像这样 old pd DataFrame car Audi
  • 通过key查询模型

    我想做的是查询数据存储中的模型 其中密钥是not我已经拥有的对象的密钥 这是一些代码 class User db Model partner db SelfReferenceProperty def text message self ms
  • BeautifulSoup 3.1 解析器太容易崩溃

    我在使用 BeautifulSoup 解析一些不可靠的 HTML 时遇到了麻烦 事实证明 新版本中使用的 HTMLParser 的容忍度低于以前使用的 SGMLParser BeautifulSoup 有某种调试模式吗 我正在尝试找出如何阻
  • Lightgbm OSError,库未加载

    如果我简单地这样做 import lightgbm as lgb 我越来越 python script py Traceback most recent call last File script py line 4 in
  • 使用 Python 3 在 Mac 上没有名为“_tkinter”的模块

    我正在尝试使用 Tkinter 作为 GUI 将我的脚本捆绑到 app 中 而执行捆绑的包装器是 Platypus 当我去运行该应用程序时 我收到此错误 Traceback most recent call last File Users
  • pyqt 中的代码编辑器示例

    我尝试学习一些Qt PyQt 为此 我使用了代码编辑器示例 http doc qt io qt 4 8 qt widgets codeeditor example html的文档 当前行的突出显示效果很好 但行号不显示 实际上LineNum
  • 剥离功能未按预期工作

    def sstrip a b raw input enter the string to be stripped off i a strip b print i k raw input enter the string sstrip k o
  • Python,创建对象

    我正在尝试学习 python 现在我正在尝试掌握类的窍门以及如何使用实例来操作它们 我似乎无法理解这个练习问题 创建并返回一个学生对象 其姓名 年龄和专业为 与作为输入给出的相同 def make student name age majo
  • 在 cmd.Cmd 命令行解释器中更好地处理键盘中断

    在使用 python 的 cmd Command 创建自定义 CLI 时 如何告诉处理程序中止当前行并给我一个新的提示 这是一个最小的例子 console min py run python console min py import cm
  • Python 解释器优化

    假设我有一个字符串x Python 解释器是否足够聪明 能够知道 string replace x x 应转换为NOP 我怎样才能找到这个 是否有任何参考资料显示解释器能够根据句法分析动态执行哪种类型的优化 不 Python 不能对 NOP
  • 获取矩阵中总和值最大的列

    比方说 import numpy as np f np matrix 1 2 3 4 5 6 是否可以从矩阵中检索具有最大列和的列数 如何 你可以写 gt gt gt f sum axis 0 argmax 1 所以专栏1求和到最大的值 为
  • 使用 setuptools 从私有 Gitlab 包存储库安装 Python 包

    我为我的雇主创建了一个私人套餐 由于我被禁止将其上传到 PyPI 它是专有的 因此我将其上传到我们私人 Gitlab 中心上的项目的包索引中 我可以手动安装它 pip install my package extra index url h

随机推荐

  • Java JDK中有并发List吗?

    如何创建一个并发 List 实例 在其中可以按索引访问元素 JDK 有我可以使用的类或工厂方法吗 ConcurrentLinkedQueue 如果您不关心基于索引的访问 而只想要列表的插入顺序保留特性 那么您可以考虑java util co
  • PostgreSQL 使用“lag()”窗口函数更新查询

    我有一个涉及Postgresql数据库的任务 我对 SQL 不太有经验 我有一张贸易产品每周营业额的表格 每周提供以下信息 产品 周数 周营业额 可能是正值或负值 具体取决于天气 更多产品被购买或出售 我添加了一栏 其中包含每周的期末余额
  • for循环中的appendChild只添加1个孩子

    在 JavaScript 中 我使用 HTML 表格创建一个网格 您在 Photoshop 中看到的网格类型 网格大小是可变的 即可以由用户更改 因此必须计算每个网格方块的大小并将其除以可用像素数以获得精确大小的网格 我已经完成了所有这些
  • NERDTree - 如何删除文件

    如何使用 NERDTree 删除文件 vim 插件页面 http www vim org scripts script php script id 1658 我已将其放入我的 vimrc file set modifiable 但我不知道删
  • JOGL/OpenGL VBO - 如何渲染顶点?

    3我有以下SceneRenderer类 实现GLEventListener 我想我了解创建缓冲区 存储指向这些缓冲区的指针以及用数据填充这些缓冲区的过程 请参阅 init 方法 我奋斗的地方是展示 方法 我几乎尝试了在互联网上找到的所有内容
  • gsub() 中超过 9 个反向引用

    如何使用超过 9 个反向引用的 gsub 我希望下面示例中的输出为 e g i j o gt test lt abcdefghijklmnop gt gsub w w w w w w w w w w w w w w w w 5 7 9 10
  • 使用 Javascript 进行 SVG 旋转

    我已经在 HTML 页面中创建了一个 SVG 图像 现在我想移动 SVG 形状以使用 JavaScript 按钮 我的应用程序的 JSFiddle 在这里 http jsfiddle net johndavies91 xwMYY http
  • 寻找关于 JIDE 的反馈 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 包装 np.arrays __pow__ 方法

    我只是重新审视我的一些代码以提高性能 并遇到了一些奇怪的事情 a np linspace 10 1000 1000000 reshape 1000 1000 timeit np square a 100 loops best of 3 8
  • 捕获node.js崩溃原因

    我有一个用 node js 编写的脚本 它使用 net 库并通过 tcp 与远程服务进行通信 该脚本使用 node script js gt gt log txt 命令启动 该脚本中使用 console log 函数记录的所有内容都会写入
  • Spring Actuator 可以与非 Web Spring Boot 应用程序一起使用吗?

    我有一个 Spring Boot 应用程序 它侦听来自 IBM MQ 输入队列的消息 对消息进行一些处理 然后将消息放入输出队列 像这样的应用程序可以利用Spring执行器来监视应用程序 例如心跳检查 吗 从执行器文档来看 它似乎只能与 S
  • Swift:使用成员常量作为函数参数的默认值

    我有一个 swift 类 我试图在其中传递函数参数的默认值 class SuperDuperCoolClass UIViewController declared a constant let primaryColor UIColor UI
  • GnuRadio 伴侣 OOT XML 模式文档

    GnuRadio 伴侣使用 XML 文件来描述树外 OOT 模块块的 API 描述该 XML 模式的文档在哪里 这里有部分描述 https wiki gnuradio org index php GNURadioCompanion Crea
  • elasticsearch - 聚合返回 key 中的术语,但不是完整的字段,如何获取返回的完整字段?

    在elasticsearch实现中 我有一些基于几个字段的简单聚合 如下所示 aggs author terms field author size 20 order term asc title terms field title siz
  • 解析srt字幕

    我想解析srt字幕 1 00 00 12 815 gt 00 00 14 509 Chlapi jak to jde s t ma pracovn ma sv tlama 2 00 00 14 815 gt 00 00 16 498 Tro
  • 使用 python 将数据复制到 Vertica

    I use python and vertica python图书馆到COPY数据到Vertica DB connection vertica python connect conn info vsql cur connection cur
  • Visual Studio 2012 中没有 xaml 颜色格式

    这是我第二次安装 VS 2012 也是第一次 xaml 的颜色格式可以工作 但现在不再工作了 如果我可以更改工具中的某些元素 gt 字体和颜色 但我无法使用蓝色 恢复正常的默认方案红色 黄色外观 即使我改回默认值 你能帮忙的话 我会很高兴
  • 一个文件可以在 Git 中同时暂存和取消暂存吗?

    在处理另一个文件时 我编辑了README md然后跑了git add README md 当进行 git commit 时 我看到README md都在 要提交的更改 和 未暂存进行提交的更改 中 这有道理吗 在哪里 git我可以查看该文件
  • 如何安装并开始使用 Vuetify 和 Vue.js 3

    我在哪里可以找到新的 Vuetify 版本与 Vue js 3 兼容的文档以及如何使用 Vue cli 安装和设置它 在 vue 2 中我们这样做 vue create project name then vue add vuetify 我
  • 添加 prefix_with 子句以插入特定类

    我怎样才能定制prefix withSQLAlchemy 中的每个模型类 以便每个模型类都可以有不同的插入语句 我其实想要OR IGNORE子句添加到某些类中 PS 我对 SQLAlchemy 比较陌生 ORM 没有挂钩它的生成方式inse