【问题标题】:MySQL Query in Python [duplicate]Python中的MySQL查询[重复]
【发布时间】:2017-03-02 20:55:33
【问题描述】:

以下是我的代码示例。

SENTENCE = "Today is a wonderful day."
sent= (word_tokenize(SENTENCE))

cursor = conn.cursor()
cursor.execute('SELECT * FROM emotion_state WHERE key_word = %s', (sent))
results = cursor.fetchall()
for i in results:
    print(i)

这里我需要检查“已发送”数组中的单词是否在数据库中可用。如果“已发送”数组中的数据库中有一些可用的关键字,我需要获取所有关键字。我尝试按照以下方式进行尝试,它会产生错误

raise errorclass(errorvalue)
_mysql_exceptions.ProgrammingError: not all arguments converted during
string formatting

如何轻松进行比较?

【问题讨论】:

  • 如果sent 需要是一个元组,你应该在其中添加一个逗号,如(value,),以防它是单个值。
  • @Arount,不,使用% 运算符会使这容易受到 SQL 注入的攻击。让execute 进行绑定可以正确转义参数。
  • 但它会出错
  • @Sjoerd 哎呀,你是对的,我从互联网上删除了这个糟糕的建议 :)
  • 至少你从一开始就使用占位符。有关如何构建占位符以匹配 IN 运算符的列表,请参阅链接的 q/a。或者转移到 Postgresql 并让 psycopg2 为您处理列表。还有SQLAlchemy,它让 Python 中的 SQL 生活变得更加轻松。

标签: python mysql


【解决方案1】:

问题可能是因为这个调用的最后一个参数是一个字符串,而不是一个元组:

cursor.execute('SELECT * FROM emotion_state WHERE key_word = %s', (sent))

如你所知,元组通常是这种形式:

(a, b, c)

但是,如果它只包含一个元素,您应该使用额外的逗号来表示它是一个元组:

(a,)

或者,您可以使用列表:

[a]

【讨论】:

    【解决方案2】:

    在 SQL 中,= 运算符用于匹配单个事物。看起来你想匹配一个事物列表。试试WHERE key_word IN %s

    【讨论】:

    • 是的,我想匹配一个事物列表。能否请您提及正确的陈述。
    • @Chathurika ...他建议用IN替换=
    • @ryugie 还是同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2015-06-01
    • 1970-01-01
    • 2018-06-08
    • 2019-10-21
    • 2013-04-07
    • 1970-01-01
    相关资源
    最近更新 更多