如何在 Pandas read_sql() 中使用通配符 (%)

Posted

技术标签:

【中文标题】如何在 Pandas read_sql() 中使用通配符 (%)【英文标题】:How to Use a Wildcard (%) in Pandas read_sql() 【发布时间】:2017-03-19 10:41:37 【问题描述】:

我正在尝试运行一个包含文本通配符的 mysql 查询,如下所示:

import sqlalchemy
import pandas as pd

#connect to mysql database
engine = sqlalchemy.create_engine('mysql://user:@localhost/db?charset=utf8')
conn = engine.connect()

#read sql into pandas dataframe
mysql_statement = """SELECT * FROM table WHERE field LIKE '%part%'; """
df = pd.read_sql(mysql_statement, con=conn)

运行时,我收到与格式相关的错误,如下所示。

TypeError: 格式字符串的参数不足

使用 Pandas 读取 MySQL 时如何使用通配符?

【问题讨论】:

【参考方案1】:

您需要在 read_sql pandas 方法中使用 params 选项。

# string interpolate 
mysql_statement = """SELECT * FROM table WHERE field LIKE %s; """
df = pd.read_sql(mysql_statement, con=conn, params=("%part%",))

# variable interpolate 
# string interpolate 
val = 'part'
mysql_statement = """SELECT * FROM table WHERE field LIKE %s; """
df = pd.read_sql(mysql_statement, con=conn, params=('%' + val + '%',))

【讨论】:

【参考方案2】:
'select * from _table_ where "_column_name_" like 'somethin%' order by... '

在_column_name_ 周围加上“”为我解决了这个问题。

【讨论】:

【参考方案3】:
from sqlalchemy import create_engine, text
import pandas as pd

mysql_statement = """SELECT * FROM table WHERE field LIKE '%part%'; """
df = pd.read_sql( text(mysql_statement), con=conn)

您可以使用 sqlalchemy 中的 text() 函数

【讨论】:

会导致argument 1 must be a string or unicode object: got TextClause instead【参考方案4】:

在 pandas 的底层,它使用你给它的任何 sql 引擎来解析语句。在您的情况下,这是 sqlalchemy,因此您需要弄清楚它如何处理 %。它可能就像使用LIKE '%%part%%' 逃避它一样简单。

对于 psycopg,您可以像这样使用 params 变量:

mysql_statement = """SELECT * FROM table WHERE field LIKE %s; """
df = pd.read_sql(mysql_statement, con=conn, params=("%part%",))

【讨论】:

以上是关于如何在 Pandas read_sql() 中使用通配符 (%)的主要内容,如果未能解决你的问题,请参考以下文章

带参数的 Pandas read_sql

在 pandas 中为 read_sql 指定 dtypes

Pandas函数read_sql()在最终的sql查询中插入参数引用[duplicate]

pd.read_sql字符类型

使用 pandas.read_sql 和 MSAccess 的特定表名的“sql 执行失败”

Python pandas read_sql 返回生成器对象