【问题标题】:ValueError in MySQL python sqlalchemy queryMySQL python sqlalchemy查询中的ValueError
【发布时间】:2020-07-24 15:52:47
【问题描述】:

我正在尝试在 MySQL 数据库中的特定列中搜索包含字符串的行,例如如果我正在搜索的字符串是 ['bar', 'foo', 'dog', 'cat'],并且该列有句子,例如'This is a sentence' 我想挑出句子中存在匹配字符串的所有数据库行。因此,如果“这是一只猫”在我正在搜索的列中,则应该返回。

为此,我使用 sqlalchemy 进行查询,例如:

import pandas as pd
import sqlalchemy as sql

connect_string = 'some_db_address'
sql_engine = sql.create_engine(connect_string)


query = """SELECT * FROM database
           WHERE column_name LIKE '%word1%'
           AND column_name LIKE '%word2%' """

result = pd.read_sql_query(query, sql_engine)

这给了我一个ValueError: unsupported format character 'L' (0x4c) at index 87 错误 - 知道为什么会出现这种情况吗?

编辑:

我正在使用 python fstring 进行查询,例如:

query = f"""SELECT * FROM database
                 WHERE column_name LIKE '%{word1}%'
                 AND column_name LIKE '%{word2}%' """
result = pd.read_sql_query(query, sql_engine)

单词变量的数量发生变化,但在上面提出的示例中 word1 以“L”开头,因此出现错误消息

【问题讨论】:

  • 什么是pd?你能分享更多上下文和堆栈跟踪吗?
  • 添加更多代码,包括 word1 和 word2 的格式。
  • 很难相信这里提供的代码会导致该错误,因为任何地方都没有%L。该错误是 MySQL 驱动程序内部详细信息的结果,该驱动程序在转义任何参数后在内部使用 %-formatting。您是否在实际代码中使用某种形式的字符串格式来替换 word1 和 word2?如果是这样,那就是你的问题;您永远不应该以这种方式将参数传递给查询,而是使用驱动程序的占位符并传递参数以单独执行。
  • @lija 我已经更新了问题,我使用的是 python f 字符串,但不知道为什么会有所作为?
  • @merrydeath pd 是熊猫

标签: python mysql sql sqlalchemy


【解决方案1】:

我能够确认您的方法在 mysqlclient 和 PyMySQL 上都失败了。当 SQL 命令文本包含百分号时,read_sql_query 肯定会发生一些特殊情况。

但是,正如 cmets 中所指出的,使用这样的 SQL 注入无论如何都是一个“坏主意”™。相反,您应该使用如下查询参数:

import pandas as pd
import sqlalchemy as sa

engine = sa.create_engine("mysql+mysqldb://root:toot@192.168.0.179:3307/mydb")

with engine.begin() as conn:
    conn.execute(sa.text("CREATE TEMPORARY TABLE tmp1 (txt varchar(50))"))
    conn.execute(
        sa.text("INSERT INTO tmp1 (txt) VALUES ('Apple Lemon'), ('Lemon')")
    )

word1 = "Lemon"
word2 = "Apple"

qry = sa.text("SELECT * FROM tmp1 WHERE txt LIKE :p1 AND txt LIKE :p2")
my_params = {"p1": f"%{word1}%", "p2": f"%{word2}%"}
result = pd.read_sql_query(qry, engine, params=my_params)

print(result)
"""console output:
           txt
0  Apple Lemon
"""

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2019-01-16
    • 2020-11-03
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多