无法在官方 MySQL 连接器中获得所需的输出

Posted

技术标签:

【中文标题】无法在官方 MySQL 连接器中获得所需的输出【英文标题】:Can't get the desired output in the official MySQL connector 【发布时间】:2013-07-03 22:17:57 【问题描述】:

我使用 Python 连接到 MariaDB。我最近从 this page 从 Pymysql 切换到本机连接器,但我无法使用这个简单的代码:

a = mysql.connect(host='127.0.0.1', port=3306, user='root', db='db', passwd='1337')
b = a.cursor()
b.execute('SELECT * FROM accounts', multi=True)
b.execute('SELECT * FROM profile', multi=True)
print(b.fetchall())
a.commit()

我以为它会打印 profile 表中的所有行,但由于某种原因它没有,并退出并出现以下错误

Traceback (most recent call last):
  File "<file>", line 142, in <module>
    print(b.fetchall())
  File "/usr/local/lib/python3.3/dist-packages/mysql/connector/cursor.py", line 676, in fetchall
    raise errors.InterfaceError("No result set to fetch from.")
mysql.connector.errors.InterfaceError: No result set to fetch from.

【问题讨论】:

如果您一次只执行一个查询,则不需要multi=True。不过,我不明白您为什么要执行两个单独的查询。如果你只想要profile 表,那么你为什么还要accounts 表中的SELECTing 呢? 【参考方案1】:

如果您使用multi=True 参数,cursor.execute() 方法会返回一个可迭代对象,您应该使用它来获取结果。 section 8.3.4 of the documentation中有一个使用示例。

但是,如果您打算在单个查询中执行多个语句,则只需要使用它,例如...

iterable = b.execute('SELECT * FROM accounts; SELECT * FROM profile', multi=True)
for item in iterable:
    print(item.fetchall())

...虽然这是PEP 249 的非标准扩展。

如果您只需要执行单个查询,那么省略multi 参数会简单得多...

b.execute('SELECT * FROM profile')
print(b.fetchall())

...符合 PEP 249。

【讨论】:

以上是关于无法在官方 MySQL 连接器中获得所需的输出的主要内容,如果未能解决你的问题,请参考以下文章

Spring配置JDBC连接OrcaleMySqlsqlserver

如何估计 MySQL 查询所需的临时磁盘空间?

在大查询中连接多个表

VS2013与MySql建立连接;您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧

无法在 C++ 中获得所需的结果

Debezium 失败 - 无法复制,因为主服务器清除了所需的二进制日志