繁体   English   中英

在 SQL 查询中使用 Python 变量作为表名和列值

[英]Using Python variables for table name and column value in an SQL query

我有一个 Python 函数可以从 SQL 表读取到 pandas DataFrame:

def project_cable_collector(dbase, table, project):
    engine = create_engine(dbase)
    df = pd.read_sql('SELECT * from table WHERE project_id = project', engine)
    return (df)

但是它返回sqlalchemy.exc.ProgrammingError

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "table"
LINE 1: SELECT * from table WHERE project_id = project

我尝试编辑引号以查看是否可以修复,但失败了。 有任何想法吗?

您当前问题的确切解决方法可能是使用 f 字符串:

def project_cable_collector(dbase, table, project):
    engine = create_engine(dbase)
    sql = f"SELECT * FROM {table} WHERE project_id = {project}"
    df = pd.read_sql(sql, engine)
    return (df)

但是,请注意,使用连接和替换以这种方式构建 SQL 查询字符串是非常不可取的。 原因是您的函数引入了一种称为 SQL注入的东西,这意味着有人可以将恶意 SQL 代码片段传入该函数并尝试让您的 Python 脚本执行它。 相反,您应该阅读有关使用准备好的语句的信息。

继 Tim 的回答之后,您需要使用 f 字符串将表插入到 SQL 文本中,但您应该使用参数来指定列

from sqlalchemy import text

# …

def project_cable_collector(dbase, table, project):
    engine = create_engine(dbase)
    sql = f"SELECT * FROM {table} WHERE project_id = :project_id"
    df = pd.read_sql_query(text(sql), engine, params=dict(project_id=project))
    return df

另请注意, read_sql_query()优于read_sql()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM