2015-10-06 166 views
0

因此,我正在研究Python脚本以从redshfit中的特定列中获取所有行。这个想法是在第二个SQL命令中循环遍历列中的每个项目以进行更改。例如,我正在考虑从特定模式中提取表名,然后执行ALTER TABLE来更改每个表的所有者。下面是我得到的代码:返回SQL查询结果作为python中的变量

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() 

现在,这几乎作品。我遇到的问题是将select语句中的“table_name”传递给alter语句。 select语句给出了打印命令的输出如下:

('TABLE_NAME',) 

然后把它传递给ALTER语句,如:

ALTER TABLE ('TABLE_NAME',).schema OWNER TO new_Owner 

然后ALTER语句失败:

syntax error at or near "(" 

认为需要发生的是,select语句中的特殊字符需要被删除,以便TABLE_NAME不经过t下摆。显然,我的谷歌搜索技巧缺少一些东西,所以任何想法都会有所帮助。谢谢!

回答

0

AsIs

args2 = (AsIs(schema), AsIs(table_name[0]), AsIs(new_owner)) 
+0

你好,感谢您的回应!我必须对for循环进行更改,以便该命令遍历每个表名,但它的作用就像一个魅力。 – user3140412

1

你应该使用table_name[0],因为table_nametuple和你想要的字符串是在索引0

因此,使它像

args2 = (table_name[0],schema,new_owner) 
+0

您好,感谢响应!不幸的是,这会导致语法错误,因为它看起来像是将单引号封装到每个变量中。该命令最终看起来像'ALTER TABLE'table_name'。'schema'OWNER TO'new_owner''。显然redshift不喜欢那种格式... – user3140412