在python脚本里执行
    
1    sql_gp1 = "VACUUM dwd_access_record_inout_temp"
2     sql_gp2 = "delete from dwd_access_record_inout_temp t where t.indate > (select now()::timestamp-interval '36 hour')"
3     conn = gputil.connect(logger,target_host,target_user,target_password,target_db)
4     #gputil是自己导入pgdb写的模块
5     cur = conn.cursor()
6     cur.execute(sql_gp1)
7     cur.execute(sql_gp2)
8     conn.commit()
9  
报错
    psycopg2.InternalError: VACUUM cannot run inside a transaction block
    
查阅资料
   
 报错的原因是:Psycopg2 会开启一个 新的 transaction 在每次调用  execute()时,而VACUUM需要在 transaction之外执行,所以我们需要打开一个  autocommit connection 去执行 vacuum。
    
    
修改后代码:
       
 1 conn1 = gputil.connect(logger,target_host,target_user,target_password,target_db)
 2 conn2 = psycopg2.connect(database=target_db, user=target_user, password=target_password,host=target_host)
 3 # conn2.set_isolation_level(0)     如果psycopg是2.4.2版本前的,只能这样写
 4 conn2.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
 5  
 6 cur1 = conn1.cursor()
 7 cur2 = conn2.cursor()
 8  
 9 cur2.execute(sql_gp1)
10  
11 cur1.execute(sql_gp2)
12 conn1.commit()
13  
14 os.system("python /application/datax2/bin/datax.py /root/test_hgm/access_record_process/dwd_inout_temp.json")
15 conn1.commit()

  可能遇到的问题

    如果如下这样写,或者 或者自己用其他包写的conn2报下面的错了

1 conn2=gputil.connect(logger,target_host,target_user,target_password,target_db)

 
    用psycopg2包(pgdb包也是调用的psycopg2)调用connect()
conn2 = psycopg2.connect(database=target_db, user=target_user,password = target_password,host=target_host) 

  

 
 

转载于:https://www.cnblogs.com/huangguoming/p/10761980.html

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐