Mat*_*rth 6 python postgresql sqlalchemy pg8000
我试图在 Sqlalchemy 中执行原始 sql 插入语句,当执行构造的插入语句时,SQL Alchemy 不会抛出错误,但这些行不会出现在数据库中。
据我所知,这不是语法错误(见第 2 点),也不是引擎错误,因为 ORM 可以正确执行等效的写入(见第 1 点),它正在找到它应该写入的表也是(见第3点)。我认为这是事务未提交的问题,并尝试解决此问题(参见第 4 点),但这并没有解决问题。是否可以创建嵌套事务以及什么会启动“第一个”事务?
谢谢您的任何答复。
一些背景:
我知道 ORM 促进了这一点,并且已经使用了这个功能并且它可以工作,但对于我们的应用程序来说太慢了。我们决定尝试对这个特定的写入函数使用原始 sql,因为它的调用频率以及其他所有内容的 ORM。使用 ORM 的等效方法完美地工作,并且两者使用相同的引擎,所以它不可能是引擎问题,对吧?
我已经发布了一个使用原始 sql 的方法直接向数据库构造的 SQL 示例,并且读取效果很好,所以我不认为这是语法错误。
它与数据库正确通信,并且可以找到表,因为表和列名称的任何语法错误都会引发编程错误,因此它不仅仅是将东西扔到“void”中。
阅读完后,我的第一个想法是,这是事务错误,并且正在创建事务但未关闭事务,因此构造了执行语句以确保正确创建和提交事务。
with self.Engine.connect() as connection:
connection.execute(Insert_Statement)
connection.commit
Run Code Online (Sandbox Code Playgroud)
所谓的“插入语句”已使用 sqlalchemy“文本”函数转换为文本,我不太明白为什么如果我将构造的字符串直接传递给执行语句它不会执行,但提及它以防相关。
其他可能相关的事情:Python3 在单个 ec2 实例上运行,postgres 数据库在另一个实例上运行。该表特别是一个获取实时数据的 timescaledb 超表,因此需要非常快速的写入,但可能不相关。
当前使用 pg8000 作为方言,除了 psycopg2 之外没有任何特殊原因,在尝试使用 ORM 执行等效方法时会抛出错误。
只是为了防止其他人最终来到这里,回答这个问题:
正如@snakecharmerb 指出的那样,问题是未能将 commit 作为方法调用。Gord Thompson 还提供了一种使用“开始”的替代方法,该方法自动提交,而不是连接,这是一种“即时提交”风格的事务。
| 归档时间: |
|
| 查看次数: |
2482 次 |
| 最近记录: |