mysql python sqlalchemy查询中的valueerror

vlurs2pr  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(594)

我试图在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)

其中word变量的数量发生了变化,但在上面提到的示例中,word1以“l”开头,因此出现了错误消息

jaxagkaj

jaxagkaj1#

我可以确认你的方法在mysqlclient和pymysql上都失败了。这件事肯定有点奇怪 read_sql_query 当sql命令文本包含百分号时。
然而,正如在评论中所指出的,像那样使用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
"""

相关问题