python - 在 Python/Pandas/PostgreSQL 中将表名作为函数参数传递

标签 python sql postgresql pandas prepared-statement

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

import pandas as pd
import psycopg2 as pg
import pandas.io.sql as psql
from psycopg2 import sql

sql_query = sql.SQL("SELECT * FROM {} limit %d offset %d" % (table_name, chunk_size, offset)).format(sql.Identifier(table_name)) 
df = psql.read_sql_query(sql_query, connection)

有什么建议吗?

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

我尝试过

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

最佳答案

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

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

请阅读 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'

关于python - 在 Python/Pandas/PostgreSQL 中将表名作为函数参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43889687/

相关文章:

php - 在同一脚本php中执行两个查询

sql - 如何从 TRINO 中的键/值对象数组中提取值并创建逗号分隔的值数组

postgresql - 斯卡拉光滑。错误的分页\w Postgres

python - networkx - weight in betwenness 和 current flow betweenness 的含义

python - Cloud Dataflow 写入 BigQuery Python 错误

python - 如何从 Tkinter 中的列表创建下拉菜单?

sql - SQL查询中如何使用索引

sql - 如何一次将升级脚本应用于多个 PostgreSQL 模式?

javascript - 如何计算模型内的嵌套元素?

python - python,matplotlib:谱图数据数组值与谱图图不匹配