Python MySql Connector 准备好的语句和字典类

Posted

技术标签:

【中文标题】Python MySql Connector 准备好的语句和字典类【英文标题】:Python MySql Connector prepared statement and dictionary class 【发布时间】:2018-08-31 21:46:16 【问题描述】:

如何使我的光标既是准备好的语句又是字典。 我有以下。

 cursor(cursor_class = mysqlCursorPrepared)
 prints <class 'mysql.connector.cursor.MySQLCursorPrepared'>
 cursor(dictionary = True)
 prints <class 'mysql.connector.cursor.MySQLCursorDict'>

所以我用字典覆盖了准备好的语句。我正在为 python3 使用 mysql 连接器。

我试过了

 cursor(prepared=True,dictionary=True)

那个错误与

Cursor not available with given criteria: dictionary, prepared

有意思

cursor(cursor_class = MySQLCursorPrepared,dictionary = True)

我没有收到任何错误,但数据不是字典类型。

【问题讨论】:

【参考方案1】:

我也有同样的问题。 Prepared 和 Dictionary 不能一起工作。

我报告了错误:https://bugs.mysql.com/bug.php?id=92700

现在我们等待;)

【讨论】:

谢谢。我找到了解决方法。我使它成为一个准备好的语句,然后使用 dictzip 将数据放入字典中。 似乎他们不会解决这个问题。我希望他们也能解决类似的声明问题。目前没有使用准备好的语句来做类似语句的干净方法。 select * from table where col like %s【参考方案2】:

使用行值压缩cursor.column_names 是一个很好的解决方法:

cursor = connection.cursor(prepared=True)
query = 'SELECT foo, bar FROM some_table WHERE a = %s AND b = %s'
a = 1
b = 42
cursor.execute(query, [a, b])
rows = cursor.fetchall()
for row in rows:
    result = dict(zip(cursor.column_names, row))
    print(result['foo'], result['bar'])

有关MySQLCursor.column_names 的文档,请参阅https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-column-names.html

【讨论】:

我相信你的最后一行应该是 print(result['foo'], result['bar']) 谢谢,@KenIngram。固定。【参考方案3】:

这种天真的解决方法似乎对我有用 - 如果我禁用 SSL,我可以在“strace”输出中看到多个相同的查询只会发送到服务器一次,并且当我遍历游标的行时,我肯定会返回字典:

from mysql.connector.cursor import MySQLCursorDict, MySQLCursorPrepared

class PreparedDictionaryCursor(MySQLCursorDict, MySQLCursorPrepared):

    pass

【讨论】:

以上是关于Python MySql Connector 准备好的语句和字典类的主要内容,如果未能解决你的问题,请参考以下文章

python mysql connector

准备mysql-connector-java

mysql-connector-python、mysql-connector-python-rf 和 mysql-connector-repackaged 有啥区别?

没有使用 MySQL Connector/J 的服务器端准备语句

为啥mysql.connecter python准备好的语句在bytearray中返回字符串

python操作mysql——mysql.connector