我正在尝试学习如何在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函数,以根据警告级别和/或代码以某种方式进行区分。

08-28 00:23
查看更多