[英]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.