我正在尝试在 Sqlalchemy 中执行原始 sql 插入语句,当执行构造的插入语句但行没有出现在数据库中时,SQL Alchemy 不会引发错误。
据我所知,这不是语法错误(参见第 2 项),也不是引擎错误,因为 ORM 可以正确执行等效写入(参见第 1 项),它正在找到它应该写入的表也是(见第 3 条)。我认为这是一个事务未提交的问题,并试图解决这个问题(见第 4 点),但这并没有解决问题。是否可以创建嵌套事务,可以说什么会开始“第一个”?
谢谢你的任何答案。
一些背景:
我知道 ORM 促进了这一点并且已经使用了这个特性并且它可以工作,但是对于我们的应用程序来说太慢了。我们决定尝试对这个特定的写入函数使用原始 sql,因为它被调用的频率以及其他所有内容的 ORM。使用 ORM 的等效方法可以完美运行,并且两者都使用相同的引擎,所以这不会是引擎问题吧?
我已经发布了一个使用原始 sql 的方法直接构造到数据库的 SQL 示例,并且可以正常读取,所以我认为这不是语法错误。
它与数据库正确通信,并且可以找到表,因为表名和列名的任何语法错误都会引发程序错误,因此可以说它不仅仅是将东西扔进“空白”。
阅读后我的第一个想法是这是事务错误,并且正在创建事务而不是关闭事务,因此构造了执行语句以确保正确创建和提交事务。
with self.Engine.connect() as connection: connection.execute(Insert_Statement) connection.commit
所谓的“插入语句”已使用 sqlalchemy 的“文本”函数转换为文本,我不太明白为什么如果我将构造的字符串直接传递给执行语句,它不会执行,但如果它是相关的,请提及它.
其他可能相关的事情:Python3 在单个 ec2 实例上运行,而 postgres 数据库在另一个实例上运行。该表尤其是采用实时数据的 timescaledb 超表,因此需要非常快速的写入,但可能不相关。
目前使用 pg8000 作为方言,除了 psycopg2 之外没有特殊原因,在尝试使用 ORM 执行等效方法时抛出错误。