【问题标题】:How to Use a Wildcard (%) in Pandas read_sql()如何在 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 时如何使用通配符?

【问题讨论】:

    标签: python mysql python-2.7 wildcard


    【解决方案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%",))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-16
          相关资源
          最近更新 更多