ProgrammingError 1064 делает CREATE TABLE AS SELECT из существующей таблицы с MySQL in Python - PullRequest
1 голос
/ 05 апреля 2020

У меня есть существующая таблица в облаке, и я хочу сделать ее копию. Я подключаюсь к своей базе данных через py mysql, извлекаю имя пользователя из входных данных, предоставленных новым пользователем, и я хочу создать новую таблицу, которая будет вызываться именем пользователя, и эта таблица будет копией оригинальной , Когда я запускаю код ниже, у меня появляется следующая ошибка:

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''username' AS SELECT * FROM original_table' at line 1")

uname = blabla@bla.com
conn = pymysql.connect(
                    host="db.host",
                    port=int(3306),
                    user=user,
                    passwd=password,
                    db=db,
                    charset='utf8mb4'
                )
                cur = conn.cursor()
                table_name = uname.replace('@', '_').replace('.', '_')
                print('TABLE NAME:', table_name)
                cur.execute(""" CREATE TABLE %s AS SELECT * FROM original_table """, (table_name))

1 Ответ

2 голосов
/ 05 апреля 2020

Параметр цитирования предназначен для цитирования значений . Заключение в кавычки имен таблиц не работает, потому что в MySQL способ заключать в кавычки имя таблицы, используя обратные кавычки (`), а не кавычки.

MariaDB [test]>  CREATE TABLE 'username' AS SELECT * FROM my_table;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''username' AS SELECT * FROM my_table' at line 1

В этом случае вам нужно использовать форматирование строки для создайте оператор SQL (вы можете использовать обратные кавычки для защиты от SQL -инъекции *):

cur.execute(""" CREATE TABLE `%s` AS SELECT * FROM original_table """ % table_name)

* Я не эксперт о SQL -инъекции, поэтому проведите некоторое исследование, если table_name происходит за пределами вашего приложения.

...