发送 ALTER TABLE 时 SQLAlchemy 挂起

问题描述 投票:0回答:1

我正在尝试使用 SQLAlchemy 向 PostgreSQL 表添加一列。 我在几个线程中读到,执行此操作的最简单方法是发送纯 SQL,而不是修改 Table 对象。

我的查询非常基本:

import sqlalchemy
engine = create_engine("postgresql://user@host:port/db")
query = sqlalchemy.text("alter table schema.table add column if not exists column int")
with engine.begin() as conn:
    resultAddColumn = conn.execute(query)

# I also tried
# with engine.connect() as conn:
#    resultAddColumn = conn.execute(query)
#    conn.commit()

# and also
# conn = engine.connect()
# resultAddColumn = conn.execute(query)
# conn.commit()
# conn.close()

奇怪的是,如果我直接在交互式终端中发送此命令(“手动”),它工作正常。 但我在使用 (windows)

python script.py
调用的脚本中使用它,并且在运行脚本时,SQLAlchemy 挂在
conn.execute(query)
命令处(在上述三种方法中)。阻止它的唯一方法是杀死终端。 我尝试了其他 SQL 查询,例如 SELECT,它也工作得很好。

我做错了什么? 谢谢。

SQLAlchemy 2.0.34 和 Python 3.11.10。

python postgresql sqlalchemy
1个回答
0
投票

您的

ALTER TABLE
语句在语法上不正确(您不能命名列
columns
),但如果这与语句实际的样子类似,那么无论表有多大,它都会非常快。

此类语句挂起任意时间的唯一原因是是否存在使用该表的并发查询或事务。原因是这样的

ALTER TABLE
需要
ACCESS EXCLUSIVE
锁,即使与
ACCESS SHARE
所持有的
SELECT
锁也会发生冲突。

在运行之前,您必须确保使用该表的所有并发事务都已关闭

ALTER TABLE

© www.soinside.com 2019 - 2024. All rights reserved.