Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在SQLAlchemy中进行手动提交?_Postgresql_Pandas_Sqlalchemy_Psycopg2 - Fatal编程技术网

Postgresql 如何在SQLAlchemy中进行手动提交?

Postgresql 如何在SQLAlchemy中进行手动提交?,postgresql,pandas,sqlalchemy,psycopg2,Postgresql,Pandas,Sqlalchemy,Psycopg2,我试图通过SQLAlchemy运行VACUUM,但它不起作用,因为它位于事务块中 with engine.begin() as connection: S = orm.session.sessionmaker()() pd.io.sql.execute('DROP TABLE IF EXISTS %s' % table_name, connection) df.to_sql(table_name, connection, chunksize=1000) S.com

我试图通过SQLAlchemy运行
VACUUM
,但它不起作用,因为它位于事务块中

with engine.begin() as connection:
    S = orm.session.sessionmaker()()
    pd.io.sql.execute('DROP TABLE IF EXISTS %s' % table_name, connection)
    df.to_sql(table_name, connection, chunksize=1000)
    S.commit()
    S.close()

engine.execute('VACUUM')
如您所见,我确实手动提交并关闭了会话,但仍然存在一个异常:

File "../__init__.py", line 115, in write_file engine.execute('VACUUM')
...
cursor.execute(statement, parameters)
sqlalchemy.exc.InternalError: (psycopg2.InternalError) VACUUM cannot run inside a transaction block
[SQL: 'VACUUM']
我尝试了各种方法,阅读了其他案例和建议,但每个人似乎都推荐
autocommit
,我在本例中无法使用


如何使
VACUUM
在这里工作?

据我所知,pandas将使用给定的引擎创建自己的会话,并在执行给定的命令后提交和关闭会话。它会干扰你的手动提交吗?@Primer可能会。我看到有两个连接对象,但在熊猫的连接对象中找不到提交句柄。@VaoTsun该问题的答案再次建议自动提交。但我要么放弃,要么什么都不要。如果数据中有错误,我希望回滚而不掉落。据我所知,使用自动提交是不可能的,因为
drop
将立即提交。
vacuum
不能成为事务的一部分。所以您可以打开事务,执行drop和commit,然后将autocommit设置为true,在autocommit中执行真空,然后再次将autocommit设置为false-对吗?。据我所知,熊猫将使用给定的引擎创建自己的会话,执行给定的命令后,熊猫将提交并关闭该会话。它会干扰你的手动提交吗?@Primer可能会。我看到有两个连接对象,但在熊猫的连接对象中找不到提交句柄。@VaoTsun该问题的答案再次建议自动提交。但我要么放弃,要么什么都不要。如果数据中有错误,我希望回滚而不掉落。据我所知,使用自动提交是不可能的,因为
drop
将立即提交。
vacuum
不能成为事务的一部分。所以您可以打开事务,执行drop和commit,然后将autocommit设置为true,在autocommit中执行真空,然后再次将autocommit设置为false-对吗?。。