【问题标题】:How to pass variable values dynamically in pandas sql query如何在 pandas sql 查询中动态传递变量值
【发布时间】:2018-07-15 17:06:54
【问题描述】:

如何动态传递可变参数

order = 10100

status = 'Shipped'

df1 = pd.read_sql_query("SELECT  * from orders where orderNumber =""" +  
str(10100) + """ and status = """ + 'status' +"""  order by orderNumber """,cnx)

TypeError: 必须是 str,而不是 int

虽然我转换为字符串,但出现上述错误有什么想法吗?

有没有其他的方式来传递参数?

【问题讨论】:

  • 你能打印orders.dtypes吗?
  • orderNumber int64 orderDate object requiredDate object shippingDate object status object cmets object customerNumber int64
  • 不确定,试试下面的 unutbu 答案。

标签: python pandas sql-parametrized-query


【解决方案1】:

通过params keyword argument 提供参数来使用参数化的sql。数据库适配器将为您完成正确的参数引用,并且代码将不易受到SQL injection 攻击。 (请参阅Little Bobby Tables 以了解错误引用、非参数化 sql 可能让您陷入困境的示例。)

order = 10100

status = 'Shipped'

sql = """SELECT  * from orders where orderNumber = ?
         and status = ? order by orderNumber"""
df1 = pd.read_sql_query(sql, cnx, params=[order, status])

sql 中的?s 是parameter markers。它们被来自params 的正确引用的值替换。请注意,正确的参数标记取决于您使用的数据库适配器。例如MySQLdbpsycopg2使用%s,而sqlite3oursql使用?

【讨论】:

  • 谢谢..我正在与 Teradata 合作,它会工作吗?查询中传递的参数是否有任何限制,或者我们可以传递多个参数?
  • 我希望它应该可以工作,尽管我不熟悉 Teradata。最好的方法是尝试看看。
  • 谢谢明天在办公室检查一下
  • 所以这里我们不需要指定它会根据初始化自动选择它的字符串还是整数?
  • 数据库适配器根据参数值和表架构为您进行引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多