Команды не синхронизированы, вы не можете запустить эту команду сейчас - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь создать несколько таблиц, используя mysqldb.

Проблема в том, что при выполнении скрипта python db.py mysql выдает ошибку:

_mysql_exceptions.ProgrammingError: (2014, «Команды не синхронизированы; вы не можете запустить эту команду сейчас»)

db.py:

import MySQLdb
import MySQLdb.cursors

def init_db():
    db_conn = get_db_conn()
    cursor = db_conn.cursor()

    with open("tables.sql", 'r') as f:
        cursor.execute(f.read())

def get_db_conn():
    return MySQLdb.connect(
        host="localhost",
        user="root",
        passwd="secretcat",
        db="uptrender",
        cursorclass=MySQLdb.cursors.DictCursor
    )

init_db() 

tables.sql:

DROP TABLE IF EXISTS Test2;
DROP TABLE IF EXISTS Test;

CREATE TABLE Test (
    id INT NOT NULL
);

CREATE TABLE Test2 (
    id INT NOT NULL,
    FOREIGN KEY(id) REFERENCES Test(id)
);

В соответствии с mysql docs эта ошибка возникает, когда клиентские функции вызываются в неправильном порядке. Глядя на те, которые я использую (у меня есть только 3, я думаю), они выглядят в правильном порядке. Сначала подключаемся к базе данных, получаем курсор и, наконец, выполняем запрос для создания таблиц. Это неправильный порядок? Казалось бы, логично выполнить запрос перед подключением к базе данных ...

РЕДАКТИРОВАТЬ: я пытался закрыть соединение после заполнения базы данных таблицами, но это не имеет значения.

EDIT2: Более того, я попытался полностью удалить базу данных и заново создать ее, но mysql по-прежнему выдает ту же ошибку.

EDIT3: я обнаружил, что, если я удаляю два DROP TABLES IF EXISTS tablename -этапа в верхней части tables.sql, я не получаю ошибку. Но, кажется, только первая таблица (test) была создана (используя SHOW TABLES; в клиенте командной строки mysql, чтобы проверить это)! Что, черт возьми, там происходит?

РЕДАКТИРОВАТЬ 4: Таким образом, я изолировал проблему дальше, это не имеет ничего общего с колбой.

1 Ответ

0 голосов
/ 26 июня 2018

Хорошо, я понял, что мне нужно выполнять операторы один за другим. Я сейчас делаю это:

from flask import current_app, g

import MySQLdb
import MySQLdb.cursors
import re

def init_db():
    db_conn = get_db_conn()
    cursor = db_conn.cursor()
    f = current_app.open_resource("tables.sql")
    tables = f.read().decode('utf-8').split(';')
    f.close()
    for table in tables:
        table = re.sub('[\n\r]', '', table)
        if len(table) > 0:
            cursor.execute(table)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...