我正在尝试学习如何在python中使用SQL与MySQL(因为我的所有项目都使用MySQL),但它似乎与IF EXISTS语句有问题.
从命令行:
DROP TABLE IF EXISTS accessLogs;
Run Code Online (Sandbox Code Playgroud)
收益:
Query ok, 0 rows affected, 1 warning (o.00 sec)
Run Code Online (Sandbox Code Playgroud)
并且表已成功删除.但是,如果我使用python的execute()方法:
cursor.execute("DROP TABLE IF EXISTS accessLogs")
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
pydbCreate.py:12: Warning: Unknown table 'accessLogs'
cursor.execute("DROP TABLE IF EXISTS accessLogs")
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个错误?并且其他任何MySQL命令会导致类似的问题吗?
MySQL生成的每个警告都Warning将由MySQLdb 1.2 引发,除非您使用的是use-result游标.没有代码可以区分不同的警告.
MySQLdb没有提供足够的信息让Python的warnings模块以任何方式过滤掉自己的东西,除了消息的正则表达式.特别是,警告过滤器到达时,级别和代码已经丢失.
那么,这是您的选择:
使用比MySQLdb更灵活的东西.它的后继潮湿可能还没有准备好,但像PyMySQL这样的竞争对手.
忽略您知道的每个电话周围的警告可能会打印您不关心的警告:
with warnings.catch_warnings():
warnings.simplefilter('ignore')
cursor.execute('DROP TABLE IF EXISTS sdfdsfds') # will not warn
Run Code Online (Sandbox Code Playgroud)
通过消息字符串regexp忽略警告:
warnings.filterwarnings('ignore', 'unknown table')
Run Code Online (Sandbox Code Playgroud)
完全关闭MySQLdb的警告,例如,使用设置的快速和肮脏的黑客cursor._defer_warnings = True(请参阅代码以了解其工作原理).(请注意,您也可以使用此标志将其重新打开并再次关闭,因此您只能跳过某些命令的警告.但是如果您要这样做,请使用该warnings模块.)
fork,monkeypatch或子类MySQLdb重写其Cursor._warning_check功能,以基于警告级别和/或代码以某种方式区分.