我正在尝试学习如何在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命令会导致类似的问题吗?
最佳答案
mysql生成的每个警告都将由mysqldb 1.2作为Warning
引发,除非您使用的是use result游标。没有区分不同警告的代码。
mysqldb没有提供足够的信息让python的warnings
模块以任何方式过滤掉您自己的东西,除了通过消息上的regexp。特别是,当警告过滤器到达时,级别和代码已经丢失。
所以,以下是你的选择:
使用比mysqldb更灵活的方法。它的继任者可能还没有准备好,但像moist这样的竞争对手已经准备好了。
忽略您知道的每个呼叫周围的警告可能会打印您不关心的警告:
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
函数,以根据警告级别和/或代码以某种方式进行区分。