所以,我正在使用python脚本来从redshfit中的特定列中获取所有行。我们的想法是在第二个SQL命令中循环遍历列中的每个项目以进行更改。例如,我想从特定模式中提取表名,然后执行ALTER TABLE来更改每个表的所有者。这是我的代码:
def alter_table(schema,new_owner):
select = "SELECT talbe_name FROM information_schema.tables WHERE talbe_schema = %s"
args = (schema,)
cur.execute(select,args)
for table_name in cur:
print table_name
alter = "ALTER TABLE %s.%s OWNER TO %s"
args2 = (table_name,schema,new_owner)
cur.execute(alter,args2)
cur.conn.commit()
现在,这个几乎有效。我遇到的问题是传递" table_name"从select语句到alter语句。 select语句在print命令中给出以下输出:
('TABLE_NAME',)
然后传递给alter语句,如:
ALTER TABLE ('TABLE_NAME',).schema OWNER TO new_Owner
然后alter语句失败:
syntax error at or near "("
我认为需要发生的事情是需要删除select语句中的特殊字符,以便在没有它们的情况下传递TABLE_NAME。显然我的谷歌搜索技能缺少一些东西,所以任何想法都会有所帮助。谢谢!
答案 0 :(得分:1)
您应该使用table_name[0]
,因为table_name
是tuple
,您想要的字符串位于索引0。
所以让它像
args2 = (table_name[0],schema,new_owner)
答案 1 :(得分:0)
args2 = (AsIs(schema), AsIs(table_name[0]), AsIs(new_owner))