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

时间:2016-11-05 19:25:47

标签: python mysql python-2.7 wildcard

我正在尝试运行一个带有文本通配符的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时使用外卡?

5 个答案:

答案 0 :(得分: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%",))

答案 1 :(得分:1)

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()函数

答案 2 :(得分:0)

我个人更喜欢使用新的格式(.format)。您的代码将如下所示:

mysql_statement = """SELECT * FROM table WHERE field LIKE {};""".format(part_var)

或者使用命名参数(当你有多个参数时很有用):

mysql_statement = """SELECT * FROM table WHERE field LIKE {part}; """.format(part=part_var)

答案 3 :(得分:0)

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

在“ _column_name_”周围加上“”可以为我解决此问题。

答案 4 :(得分:0)

您需要在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 + '%',))