#python #mysql #mysql-python
#python #mysql #mysql-python
Вопрос:
У меня очень странная проблема с mysqldb (модулем mysql для python).
У меня есть файл с запросами для вставки записей в таблицы. Если я вызываю функции из файла, это работает просто отлично; но при попытке вызвать одну из функций из другого файла это выдает мне
_mysql_exception.Ошибка интерфейса: (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)
И база данных класса следующая :
импортируйте MySQLdb из MySQLdb.константы импортируют 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:sequenceManagermysql>python buildDB.py
D:ProgramFilesPython26libsite-packagesMySQLdb__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:sequenceManagermysqlcreate.py", line 52, in newFormat
db.execute(format_query)
File "Z:sequenceManagermysqlDatabase.py", line 19, in execute
self.conn.query(query)
_mysql_exceptions.InterfaceError: (0, '')
Предупреждение никогда раньше не было проблемой, поэтому я не думаю, что это связано.
Комментарии:
1. Можете ли вы предоставить код, в котором вызывается запрос?
2. Добавлена обратная трассировка, она не говорит намного больше ..
Ответ №1:
Я получил эту ошибку, когда пытался использовать закрытое соединение.
Комментарии:
1. Это включает в себя, было ли соединение внутренне закрыто, а не только если вы вызывали
close()
соединение
Ответ №2:
Проблема решена.. Я дважды инициализировал базу данных.. Извините, если вы потеряли время, читая это!
Комментарии:
1. Вы все еще используете метод запроса ? Я думаю, что это не допускает подстановки параметров. Это большой риск для безопасности из-за возможности атак с использованием SQL-инъекций. Если есть какой-либо пользовательский ввод, он всегда должен сначала экранироваться модулем db.
Ответ №3:
Я не смог заставить вашу настройку работать. I постоянно выдает мне одну и ту же ошибку. Однако способ подключения к базе данных и выполнения запросов к ней с помощью запроса кажется «нестандартным». С этой настройкой мне повезло больше:
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))
Таким образом, вы можете воспользоваться экранированием ввода модулей БД, что является обязательным для предотвращения атак с использованием sql-инъекций.
Комментарии:
1. Я пытался использовать курсор, но он выдает мне ошибку «Ошибка атрибута: курсор», и я не понимаю, почему. Вот почему я его не использую.. Может быть, вы могли бы помочь мне с этим?
2. Да, способ использования пакета MySQLdb является «нестандартным» (говорится в документации). Когда вы используете MySQLdb.Connection (с большой буквы C), вы получаете объект connection, который имеет метод cursor .