简体   繁体   English

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

[英]How to Use a Wildcard (%) in Pandas read_sql()

I am trying to run a MySQL query that has a text wildcard in as demonstrated below:我正在尝试运行一个包含文本通配符的 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)

When run I get the error as shown below related to formatting.运行时,出现如下与格式相关的错误。

TypeError: not enough arguments for format string类型错误:格式字符串的参数不足

How can I use a wild card when reading MySQL with Pandas?使用 Pandas 读取 MySQL 时如何使用通配符?

Under the hood of pandas, it's using whatever sql engine you've given it to parse the statement.在 pandas 的幕后,它使用您提供的任何 sql 引擎来解析语句。 In your case that's sqlalchemy, so you need to figure out how it handles % .在您的情况下,这是 sqlalchemy,因此您需要弄清楚它如何处理% It might be as easy as escaping it with LIKE '%%part%%' .它可能就像使用LIKE '%%part%%'转义它一样简单。

In the case of psycopg, you use the params variable like this:在 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)

You can use text() function from sqlalchemy您可以使用 sqlalchemy 中的 text() 函数

I personally prefer using new formatting (.format). 我个人更喜欢使用新的格式(.format)。 Your code will look like this: 您的代码将如下所示:

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

or alternatively with named parameters (useful when you have multiple parameters): 或者使用命名参数(在您有多个参数时很有用):

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

you need to use params options in read_sql pandas method.您需要在 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 + '%',))
'select * from _table_ where "_column_name_" like 'somethin%' order by... '

将 "" 放在 _column_name_ 周围为我解决了这个问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM