我们有一个基于S3数据构建的Redshift Spectrum表 - 我们试图在此表中自动添加分区 - 我可以在redshift客户端或psql shell中运行以下ALTER语句:
ALTER TABLE analytics_spectrum.page_view ADD PARTITION(date='2017-10-17') LOCATION 's3://data-hub/page_view/2017/10/17/';
但是这无法通过psycopg2执行。
sql_query = "ALTER TABLE analytics_spectrum.page_view ADD PARTITION(date='2017-10-17') LOCATION 's3://data-hub/_page_view_v3/2017/10/17/';"
import config
import psycopg2
connection = psycopg2.connect(
**config.DATABASES['redshift_db']["connection"])
cursor = connection.cursor()
cursor.execute(sql_query)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
psycopg2.ProgrammingError: syntax error at or near "("
LINE 1: ...ABLE analytics_spectrum.page_view ADD PARTITION(date='201...
对于psycopg2,它甚至不会将查询发送到redshift,并且在查询解析时执行失败。
现在我已经实现了使用subprocess.popen来执行alter语句 - 但我想将其切换回使用psycopg2。
p = subprocess.Popen(['psql',
'-h', self.spectrum_connection['host'],
'-p', self.spectrum_connection['port'],
'-d', self.spectrum_connection['dbname'],
'-U', self.spectrum_connection['user'],
'-c', sql_stmt],
env={
'PGPASSWORD': self.spectrum_connection['password']},
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = p.communicate()
建议/想法?
谢谢, Hussain Bohra
答案 0 :(得分:1)
我有同样的问题。不使用ISOLATION_LEVEL_AUTOCOMMIT执行查询会引发以下错误:
psycopg2.InternalError: ALTER EXTERNAL TABLE cannot run inside a transaction block
我修改了我的代码并且它有效。
import argparse
import sys, psycopg2
from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT
input_data = {}
input_data["db_name"] = <<DB_NAME>>
input_data["db_host"] = <<HOST_NAME>>
input_data["db_port"] = 5439
input_data["db_user"] = <<USER>>
input_data["db_pass"] = <<PASSWORD>>
con = psycopg2.connect(dbname=input_data["db_name"], host=input_data["db_host"], port=input_data["db_port"], user=input_data["db_user"], password=input_data["db_pass"])
con.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT)
cur = con.cursor()
query = <<ADD_YOUR_QUERY_HERE>>
cur.execute(query)
cur.close()
con.close()
答案 1 :(得分:0)
在查询中,您必须首先添加set autocommit=on;
才能通过交易冻结。
然后魔术就会发生,您可以对表进行分区。