【问题标题】:Return SQL Query results as a variable in python在 python 中将 SQL 查询结果作为变量返回
【发布时间】:2016-01-03 17:28:04
【问题描述】:

所以,我正在使用 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()

现在,这几乎可以工作了。我遇到的问题是将 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。显然我的谷歌搜索技能缺少一些东西,所以任何想法都会有所帮助。谢谢!

【问题讨论】:

    标签: python postgresql psycopg2 amazon-redshift


    【解决方案1】:

    您应该使用table_name[0],因为table_nametuple,而您想要的字符串位于索引0。

    就这样吧

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

    【讨论】:

    • 您好,感谢您的回复!不幸的是,这会导致语法错误,因为它看起来像是将单引号封装到每个变量中。该命令最终看起来像ALTER TABLE 'table_name'.'schema' OWNER TO 'new_owner'。显然 redshift 不喜欢这种格式...
    【解决方案2】:

    AsIs

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

    【讨论】:

    • 您好,感谢您的回复!我必须对 for 循环进行更改,以便命令遍历每个表名,但它的工作原理就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2022-01-06
    • 2020-03-12
    • 2014-06-18
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多