命令不同步,您现在无法运行此命令

时间:2018-06-26 09:59:07

标签: python mysql synchronization mysql-python

我正在尝试使用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语句,我不会得到该错误。但是似乎只有第一个表(测试)已创建(在mysql命令行客户端使用SHOW TABLES;进行验证)!到底发生了什么事?

EDIT4:所以我进一步隔离了这个问题,它与烧瓶无关。

1 个答案:

答案 0 :(得分:0)

好的,我发现我必须一一执行语句。我现在这样做:

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)