我试图使用psycopg2向表中添加一些新列。PostgreSQL缺少一个ALTER TABLE table ADD COLUMN IF NOT EXISTS
,所以我在它自己的事务中添加每一列。如果该列存在,则将有一个python&;postgres错误,没关系,我希望我的程序继续,并尝试添加下一列。其目标是使其成为幂等函数,因此可以连续运行多次
目前看起来是这样的:
def main():
# <snip>
with psycopg2.connect("") as connection:
create_columns(connection, args.table)
def create_columns(connection, table_name):
def sql(sql):
with connection.cursor() as cursor:
cursor.execute(sql.format(table_name=table_name))
sql("ALTER TABLE {table_name} ADD COLUMN my_new_col numeric(10,0);")
sql("ALTER TABLE {table_name} ADD COLUMN another_new_col INTEGER NOT NULL;")
但是,如果存在my_new_col
,则会出现异常ProgrammingError('column "parent_osm_id" of relation "relations" already exists\n',)
,这是意料之中的,但当它尝试添加another_new_col
时,会出现异常InternalError('current transaction is aborted, commands ignored until end of transaction block\n',)
psycogpg2 document for the ^{with connection.cursor() as cursor:
将在事务中包装该代码。这显然没有发生。实验表明,我需要两个级别的with
语句来包含pscyopg2.connect
调用,然后得到一个事务
我如何传递^{
事实并非如此,它说:
所以它不是关于由
with
处理的游标对象,而是连接对象还值得注意的是,当我们离开
with
子句时,游标持有的所有资源都将被释放因此,回到您的代码,您可能会将其重写为:
确保为执行的每个查询将连接包装在
with
中,因此如果失败,连接上下文管理器将恢复事务相关问题 更多 >
编程相关推荐