MySQL';如果存在';命令在python中使用时会导致错误

MySQL';如果存在';命令在python中使用时会导致错误,python,mysql,Python,Mysql,我正在尝试学习如何在python中使用SQL和MySQL(因为我所有的项目都使用MySQL),但它似乎与IF-EXISTS语句有问题 cursor.execute("DROP TABLE IF EXISTS my_database.accessLogs") 从命令行: DROP TABLE IF EXISTS accessLogs; 返回: Query ok, 0 rows affected, 1 warning (o.00 sec) 并成功删除该表。但是,如果我使用python的exec

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

cursor.execute("DROP TABLE IF EXISTS my_database.accessLogs")
从命令行:

DROP TABLE IF EXISTS accessLogs;
返回:

Query ok, 0 rows affected, 1 warning (o.00 sec)
并成功删除该表。但是,如果我使用python的execute()方法:

我得到这个错误:

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

有没有办法避免这个错误?还有其他MySQL命令会导致类似问题吗?

如果没有使用
USE
语句指定数据库,则需要指定该数据库

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

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

这不是一个错误条件


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

MySQL生成的每个警告都将由MySQLdb 1.2作为
警告发出,除非您使用的是使用结果游标。没有区分不同警告的代码

MySQLdb没有提供足够的信息,除了通过消息上的regexp之外,Python的模块不能以任何方式自己过滤掉。特别是,当警告过滤器到达时,级别和代码已经丢失

因此,以下是您的选择:


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


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

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

按消息字符串regexp忽略警告:

warnings.filterwarnings('ignore', 'unknown table')

完全关闭MySQLdb的警告提升功能,例如,使用设置
光标的快速而肮脏的技巧。_defer_warnings=True
(请参阅代码以了解其工作原理)。(请注意,您也可以使用此标志将其重新打开和关闭,因此您只需跳过某些命令周围的警告。但如果要这样做,请使用
警告
模块。)



Fork、monkeypatch或MySQLdb子类覆盖其
光标。_warning\u check
函数根据警告级别和/或代码进行某种程度的区分。

我假设db=MySQLdb.connect(“localhost”、“user”、“password”、“database\u name”)就是这样做的。假设参数的位置正确(MySQLdb文档不鼓励使用位置参数,而支持kwargs),那么应该是的。当该表不再存在时,您是否收到该警告?如果是,那么您看到打印的警告是否存在问题?如果是,您可以抑制警告。请看,我还以为这只是一个警告,但当我通过命令行检查数据库时,该表没有显示。我不是mysql专家,但AFAICT,确实如此只是一个警告——请注意,mysql命令行也给出了一个警告:查询正常,0行受影响,1个警告(0.00秒)@grim_v3.0:哪个“那个”?我给出了半打不同的建议;未来的读者可能会知道你遵循了哪个(以及为什么)这样他们就知道有一个可以为他们工作。@TML:您的编辑删除了所有的代码格式,使答案不可读。很公平-它们没有在我的UA上真正呈现,所以我没有意识到它们在那里。@TML:我试图找到一些方法将(多行)代码放在其他格式选项下面,但是(除了引号)这似乎是不可能的,或者超出了我的范围…@abarnert:对不起,警告。filterwarnings('ignore','unknown table')修复了它。