«Таблица не существует» при создании с использованием функции execute () с параметром «multi = True» - PullRequest
0 голосов
/ 13 января 2020

MySQL 5.6.

Я не понимаю, почему, если я использую multi = True таблица параметров не создается. Я не нахожу никакой информации об этом в документации. Если я разделяю все запросы, это работает, но я не хочу их разделять.

from mysql import connector as connector

conn = connector.connect(
    user='root',
    password='root',
    host='127.0.0.1',
    database='ra'
)
conn.autocommit = True
cursor = conn.cursor(dictionary=True, buffered=True)

sql = """
DROP TABLE IF EXISTS tab01;
CREATE TABLE tab01 (nzu DECIMAL(5,0) PRIMARY KEY,
                    nbr DECIMAL(3,0) DEFAULT NULL,
                    nland DECIMAL(5,0) DEFAULT NULL,
                    nlandtype DECIMAL(5,0) DEFAULT NULL,
                    nzuarea DECIMAL(12,1) DEFAULT NULL,
                    nzuareaos DECIMAL(12,1) DEFAULT NULL) ENGINE = MyISAM;
INSERT INTO tab01 (SELECT zu.nzu, zu.nbr, zu.nland,
                    IF(ISNULL(lands.nlandtype),0,lands.nlandtype) AS nlandtype,
                    0.0 AS nzuarea, 0.0 AS nzuareaos
                    FROM (SELECT * FROM zu WHERE nhoz = '6204000001') AS zu
                    LEFT JOIN lands AS lands ON zu.nland=lands.nland
                    ORDER BY nzu);
"""
cursor.execute(sql, multi=True) 
cursor.execute('SELECT * FROM tab01') 
# mysql.connector.errors.ProgrammingError: 1146 (42S02): Table 'ra.tab01' doesn't exist
result = cursor.fetchone()

1 Ответ

0 голосов
/ 13 января 2020

Вы уверены, что ваш CREATE работает? Я считаю, что параметр ENGINE должен находиться в конце оператора CREATE:

CREATE TABLE tab01 (
 nzu DECIMAL(5,0) PRIMARY KEY,
 nbr DECIMAL(3,0) DEFAULT NULL,
 nland DECIMAL(5,0) DEFAULT NULL,
 nlandtype DECIMAL(5,0) DEFAULT NULL,
 nzuarea DECIMAL(12,1) DEFAULT NULL,
 nzuareaos DECIMAL(12,1) DEFAULT NULL
) ENGINE = MyISAM;

Также этот оператор:

cursor.execute(sql, multi=True)

создает итератор для результатов. Похоже, это ленивый (то есть он выполняет SQL операторы только по мере необходимости). Вы никогда не запрашиваете результаты для второго утверждения, поэтому оно выполняет только первое. Попробуйте:

for _ in cursor.execute(sql, multi=True): pass
...