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

How to Use a Wildcard (%) in Pandas read_sql()

我正在尝试 运行 具有文本通配符的 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: not enough arguments for format string

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

在 pandas 的幕后,它使用您提供给它的任何 sql 引擎来解析语句。在你的情况下,那是 sql 炼金术,所以你需要弄清楚它是如何处理 % 的。它可能就像使用 LIKE '%%part%%' 转义一样简单。

在 psycopg 的情况下,您可以像这样使用 params 变量:

mysql_statement = """SELECT * FROM table WHERE field LIKE %s; """
df = pd.read_sql(mysql_statement, con=conn, params=("%part%",))
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() 函数

'select * from _table_ where "_column_name_" like 'somethin%' order by... '

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

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

# 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 + '%',))