我正在尝试学习如何在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命令会导致类似的问题吗?
答案 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流中。