MySQL'IF EXISTS'命令在python中使用时会导致错误

时间:2013-11-19 19:16:49

标签: python mysql

我正在尝试学习如何在python中使用SQL与MySQL(因为我的所有项目都使用MySQL),但它似乎与IF EXISTS语句有问题。

来自命令行:

DROP TABLE IF EXISTS accessLogs;

返回:

Query ok, 0 rows affected, 1 warning (o.00 sec)

并成功删除该表。但是,如果我使用python的execute()方法:

cursor.execute("DROP TABLE IF EXISTS accessLogs")

我收到此错误:

pydbCreate.py:12: Warning: Unknown table 'accessLogs'
    cursor.execute("DROP TABLE IF EXISTS accessLogs")

有没有办法解决这个错误?并且其他任何MySQL命令会导致类似的问题吗?

2 个答案:

答案 0 :(得分:9)

MySQL生成的每个警告都将由MySQLdb 1.2引发为Warning,除非您使用的是use-result游标。没有代码可以区分不同的警告。

MySQLdb没有提供足够的信息让Python的warnings模块以任何方式过滤掉自己的东西,除了消息的正则表达式。特别是,警告过滤器到达时,级别和代码已经丢失。

所以,这是您的选择:


使用比MySQLdb更灵活的东西。它的继任者moist可能还没有准备好,但像PyMySQL这样的竞争对手是。


忽略您知道的每个电话周围的警告可能会打印出您不关心的警告:

with warnings.catch_warnings():
    warnings.simplefilter('ignore')
    cursor.execute('DROP TABLE IF EXISTS sdfdsfds') # will not warn

忽略消息字符串regexp:

的警告
warnings.filterwarnings('ignore', 'unknown table')

完全关闭MySQLdb的警告,例如,使用设置cursor._defer_warnings = True的快速和肮脏的黑客(请参阅代码以了解其工作原理)。 (请注意,您也可以使用此标志将其重新打开并再次关闭,因此您只能跳过某些命令的警告。但如果您打算这样做,请使用warnings模块。)


fork,monkeypatch或子类MySQLdb覆盖其Cursor._warning_check函数,以根据警告级别和/或代码以某种方式区分。

答案 1 :(得分:-2)

如果未使用USE语句指定数据库,则需要指定数据库。

cursor.execute("DROP TABLE IF EXISTS my_database.accessLogs")

修改

现在看来,问题在于警告本身。警告只是 - 一个警告。正如abarnert所指出的,MySQLdb向Python的警告模块报告MySQL警告。默认行为是打印到stderr流。

这不是错误条件。

使用abarnert的建议过滤警告,使其不会出现在stderr流中。