ProgrammingError 1064 doing CREATE TABLE AS SELECT from an existing table with MySQL in Python

Jean-Sebastien :

I have an existing table in the cloud and I want to make a copy of it. I connect to my database via pymysql, extract the username from an input provided from the new user, and I want to create a new table that will be called by the username, and that table will be a copy of the original one. When I run the code below, I have the following error:

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 = [email protected]
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))
snakecharmerb :

Parameter quoting is for quoting values. Quoting table names does not work, because in MySQL the way to quote a table name is by using backticks (`), not quotation marks.

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

In this cause you need to use string formatting to create the SQL statement (you can use backticks to defend against SQL-injection*):

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

* I'm not an expert on SQL-injection, so do some research if table_name originates outside your application.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=410649&siteId=1