我正在尝试使用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:所以我进一步隔离了这个问题,它与烧瓶无关。
答案 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)