我试图在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
所谓的"插入语句"已经使用sqlalchemy 'text'函数转换为文本,我不太明白为什么如果我将构造的字符串直接传递给执行语句,但在相关的情况下提到它,它就不会执行。
其他可能相关的内容:Python3运行在一个单独的ec2实例上,postgres数据库运行在另一个实例上。这个表是一个使用实时数据的timescaledb超表,因此需要非常快的写操作,但可能不相关。
目前使用pg8000作为方言,除了psycopg2之外没有特别的原因,当尝试使用ORM执行等效方法时抛出错误。
如果有人在这里结束了这个问题,就回答这个问题:
正如@snakecharmerb指出的那样,问题是未能将commit作为方法调用。Gord Thompson还提供了一个使用'begin'的替代方法,它可以自动提交,而不是连接,这是一个'commit as you go'风格的事务。