【问题标题】:Sql Alchemy Insert Statement failing to insert, but no errorSqlalchemy 插入语句插入失败,但没有错误
【发布时间】:2021-12-07 07:42:20
【问题描述】:

我正在尝试在 Sqlalchemy 中执行原始 sql 插入语句,当执行构造的插入语句但行没有出现在数据库中时,SQL Alchemy 不会引发错误。

据我所知,这不是语法错误(参见第 2 项),也不是引擎错误,因为 ORM 可以正确执行等效写入(参见第 1 项),它正在查找它所在的表也应该写(见第3条)。我认为这是一个事务未提交的问题,并试图解决这个问题(见第 4 点),但这并没有解决问题。是否可以创建一个嵌套事务,可以说什么会启动“第一个”?

感谢您的任何回答。

一些背景:

  1. 我知道 ORM 促进了这一点,并且已经使用了这个特性并且它可以工作,但是对于我们的应用程序来说太慢了。我们决定尝试对这个特定的写入函数使用原始 sql,因为它被调用的频率以及其他所有内容的 ORM。使用 ORM 的等效方法可以完美运行,并且两者都使用相同的引擎,所以这不会是引擎问题吧?

  2. 我已经发布了一个使用原始 sql 的方法直接构造到数据库的 SQL 示例,并且可以正常读取,所以我认为这不是语法错误。

  3. 它正在与数据库正确通信,并且可以找到表,因为任何带有表名和列名的语法错误都会引发程序错误,因此它不仅仅是将东西扔进“void”中。

  4. 阅读后我的第一个想法是这是事务错误,并且正在创建事务而不是关闭事务,因此构造了这样的执行语句以确保正确创建和提交事务。

         with self.Engine.connect() as connection:
             connection.execute(Insert_Statement)
             connection.commit
    
  5. 所谓的“插入语句”已使用 sqlalchemy 的“文本”函数转换为文本,我不太明白如果我将构造的字符串直接传递给执行语句但在中提到它,为什么它不会执行如果它是相关的。

其他可能相关的事情: Python3 在一个单独的 ec2 实例上运行,而 postgres 数据库在另一个实例上运行。特别是该表是一个 timescaledb 超表,采用实时数据,因此需要非常快速的写入,但可能不相关。

当前使用 pg8000 作为方言,除了 psycopg2 之外没有其他特殊原因,在尝试使用 ORM 执行等效方法时会引发错误。

【问题讨论】:

  • echo=True 添加到您的create_engine() 调用中,这样您就可以查看ROLLBACK 是否真的发生了。如果是这样,请尝试使用with engine.begin() as conn:
  • 你真的在调用commit方法吗? connection.commit()
  • 成功了!非常感谢!我认为当它调用 ROLLBACK 时,这是一个事务问题?根据我自己的理解,为什么 engine.begin() 解决了这个问题?
  • @snakecharmerb,啊,我不是。谢谢!
  • engine.begin() 自动提交,engine.connect() 自动回滚。

标签: python postgresql sqlalchemy pg8000


【解决方案1】:

这样就可以回答这个问题,以防其他人在这里结束:

正如@snakecharmerb 指出的那样,问题是未能将 commit 作为一种方法调用。 Gord Thompson 还提供了一种使用“开始”的替代方法,它自动提交而不是连接,这是一种“随手提交”样式的事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2013-04-30
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多