将表名作为Python / Pandas / PostgreSQL中的函数参数传递

时间:2017-05-10 10:20:38

标签: python sql postgresql pandas prepared-statement

我正在尝试使用' new'在我的SQL查询中调用table_name。安全方式(它可以很好地抵御SQL注入攻击),如下所示:http://initd.org/psycopg/docs/sql.html#module-psycopg2.sql 但是我无法使用我的代码(table_name是我函数的参数)。

def import_table(self, connection, table_name, chunk_size, offset):
    sql = "SELECT * FROM {} limit %d offset %d" 
    qry = sql.format(**dict(table=table_name)) %(chunk_size, offset)
    df_piece = psql.read_sql_query(qry, connection)

有什么建议吗?

更新(在建议的答案之后):

我试过

df = pd.concat(import_table(pg.connect("dbname=my_db user=my_user"), 'table_name', 100000, 0))

然后用:

调用它
---> 30             qry = sql_ct.format(**dict(table=table_name)) %  (chunk_size, offset)
 31             df_piece = psql.read_sql_query(qry, connection)
 32 

IndexError: tuple index out of range

但是我收到了一个错误:

{{1}}

1 个答案:

答案 0 :(得分:0)

表名/列名不能以这种方式参数化。

它可以而且应该应用于价值观。

请阅读Prepared statement

考虑以下技巧:

# param. for str format:      vvvvv
In [9]: qry = "SELECT * FROM {table} limit %d offset %d"

In [10]: qry.format(**dict(table='my_table')) %(10, 500)
Out[10]: 'SELECT * FROM my_table limit 10 offset 500'

<强>更新

In [53]: my_table = 'table_name'

In [54]: qry
Out[54]: 'SELECT * FROM {table} limit %d offset %d'

In [55]: qry.format(**dict(table=my_table)) %(10, 500)
Out[55]: 'SELECT * FROM table_name limit 10 offset 500'