2011-04-18 26 views
6

Tengo un problema muy extraño con mysqldb (módulo mysql para python).mysqldb interfaceError

Tengo un archivo con consultas para insertar registros en tablas. Si llamo a las funciones desde el archivo, funciona bien; pero cuando se trata de llamar a una de las funciones de otro archivo que me lanza una

_mysql_exception.InterfaceError: (0, '')

Realmente no entiendo lo que estoy haciendo mal aquí ..

que llamo la función de buildDB.py:

La función newFormat (..) se encuentra en create.py (importados):

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) 

Y la base de datos de clase es la siguiente:

MySQLdb importación de MySQLdb.constants importar 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) 

(I poner el código sólo es relevante)

Rastreo:

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, '') 

El la advertencia nunca ha sido un problema antes, así que no creo que esté relacionado.

+0

¿Puede proporcionar el código donde se llama a la consulta? –

+0

Por supuesto, edité mi pregunta – Johanna

+0

¿puedes publicar la trazabilidad? – XORcist

Respuesta

0

No pude conseguir que tu configuración funcione. Me da el mismo error todo el tiempo. Sin embargo, la forma de conectarse y realizar consultas al archivo db con la consulta parece ser "non-standard". Debo suerte con esta configuración:

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)) 

De esta manera usted puede tomar ventaja de la entrada de los módulos db escapa que es una necesidad para mitigar los ataques de inyección SQL.

+0

He intentado usar un cursor, pero me da un error "Error de atributo: cursor" Y no entiendo por qué. Es por eso que no lo uso ... ¿Tal vez podrías ayudarme con eso? – Johanna

+0

Sí, la forma en que usa el paquete MySQLdb es 'no estándar' (dice la documentación). Cuando usas MySQLdb.Connection (con una C mayúscula), obtienes un objeto de conexión que tiene un método __cursor__. – XORcist

2

Problema resuelto ... Estaba inicializando la base de datos dos veces ... Lo siento si perdiste tu tiempo leyendo esto!

+0

¿Sigues usando el método * query *? Creo que no permite la substición de param. Es un gran riesgo de seguridad, debido a la posibilidad de ataques de inyección SQL. Si hay alguna entrada del usuario, siempre debe ser escapada primero por el módulo db. – XORcist

18

Recibí este error cuando intentaba usar una conexión cerrada.

+2

Esto incluye si la conexión se cerró internamente, no solo si llamó 'close()' en la conexión – demongolem

Cuestiones relacionadas