【问题标题】:mysqldb interfaceErrormysqldb接口错误
【发布时间】:2023-04-11 10:48:01
【问题描述】:

我对 mysqldb(python 的 mysql 模块)有一个非常奇怪的问题。

我有一个用于在表中插入记录的查询文件。如果我从文件中调用函数,它工作得很好;但是当试图从另一个文件中调用其中一个函数时,它会抛出一个

_mysql_exception.InterfaceError: (0, '')

我真的不明白我在这里做错了什么..

我从buildDB.py调用函数:

import create

create.newFormat("HD", 0,0,0)

函数 newFormat(..) 在 create.py 中(导入):

from Database import Database

db = Database()

def newFormat(name, width=0, height=0, fps=0):
    format_query = "INSERT INTO Format (form_name, form_width, form_height, form_fps)  VALUES ('"+name+"',"+str(width)+","+str(height)+","+str(fps)+");"
    db.execute(format_query)

类数据库如下:

导入 MySQL 数据库 从 MySQLdb.constants 导入 FIELD_TYPE

class Database():
    def __init__(self):
        server = "localhost"
        login = "seq"
        password = "seqmanager"
        database = "Sequence"
        my_conv = { FIELD_TYPE.LONG: int }

        self.conn = MySQLdb.connection(host=server, user=login, passwd=password, db=database, conv=my_conv)
        # self.cursor = self.conn.cursor()

    def close(self):
        self.conn.close()

    def execute(self, query):
        self.conn.query(query)

(我只放了相关代码)

追溯:

Z:\sequenceManager\mysql>python buildDB.py
D:\ProgramFiles\Python26\lib\site-packages\MySQLdb\__init__.py:34: DeprecationWa
rning: the sets module is deprecated
  from sets import ImmutableSet
INSERT INTO Format (form_name, form_width, form_height, form_fps) VALUES ('HD',0
,0,0);
Traceback (most recent call last):
  File "buildDB.py", line 182, in <module>
    create.newFormat("HD")
  File "Z:\sequenceManager\mysql\create.py", line 52, in newFormat
    db.execute(format_query)
  File "Z:\sequenceManager\mysql\Database.py", line 19, in execute
    self.conn.query(query)
_mysql_exceptions.InterfaceError: (0, '')

该警告以前从未出现过问题,所以我认为它不相关。

【问题讨论】:

  • 你能提供调用查询的代码吗?
  • 当然,我编辑了我的问题
  • Traceback 加了,不多说了..

标签: python mysql mysql-python


【解决方案1】:

我在尝试使用关闭的连接时收到此错误。

【讨论】:

  • 这包括连接是否在内部关闭,而不仅仅是您在连接上调用了close()
【解决方案2】:

问题已解决。我正在初始化数据库两次。如果您在阅读本文时耽搁了时间,请见谅!

【讨论】:

  • 你还在使用 query 方法吗?我认为它不允许参数替换。由于存在 SQL 注入攻击的可能性,这是一个很大的安全风险。如果有任何用户输入,它应该总是首先由 db 模块转义。
【解决方案3】:

我无法让您的设置正常工作。我一直给我同样的错误。但是,您使用 query 连接和查询数据库的方式似乎是 "non-standard"。 这个设置我的运气更好:

conn = MySQLdb.Connection(user="user", passwd="******", 
                          db="somedb", host="localhost")
cur = conn.cursor()
cur.execute("insert into Format values (%s,%s,%s,%s);", ("hd",0,0,0))

通过这种方式,您可以利用 db 模块输入转义,这是缓解 sql 注入攻击所必需的。

【讨论】:

  • 我尝试使用游标,但它给了我一个错误“属性错误:游标”,我不明白为什么。这就是我不使用它的原因。也许你可以帮助我?
  • 是的,你使用 MySQLdb 包的方式是“非标准的”(文档说)。当您使用 MySQLdb.Connection(大写 C)时,您将获得一个具有 cursor 方法的连接对象。
猜你喜欢
  • 2012-11-04
  • 2018-05-23
  • 2014-01-01
  • 2016-06-08
  • 2017-01-25
  • 2012-05-08
  • 2011-10-20
  • 2016-01-11
  • 2015-12-27
相关资源
最近更新 更多