2016-04-01 4 views
0

Я хочу, чтобы создать динамическую таблицу:питон ошибка MySQL в запросе

columnames=[element[0] for element in bufferdata['data'] ] 
for index,element in enumerate(columnames): 
     columnames[index]=re.sub("[(%./)-]","",element) 
    tuple(columnames) 
    querycreatetable='''CREATE TABLE test (ID INT AUTO_INCREMENT,name VARCHAR(50),symbol VARCHAR(10),sector VARCHAR(50), 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT,%s FLOAT, 
              %s FLOAT,%s FLOAT,%s FLOAT 
              ) 
         ''' 
    try: 
     self.cursor.execute(querycreatetable,columnames) 
    except MySQLdb.ProgrammingError, e: 
     try: 
      print "MySQL Error [%d]: %s" % (e.args[0], e.args[1]) 
     except IndexError: 
      print "MySQL Error: %s" % str(e) 

, но я получаю эту ошибку: MySQL Error [1064]: У вас ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с «FLOAT» SALES в миллионах, FLOAT «Прибыль на акцию», «PE Ratio TTM» FLOAT, «PE Hi» по строке 2

кто-нибудь видит, где проблема?

ответ

2

во-первых, как сказано здесь: Check for valid SQL column name

SQL identifiers and key words must begin with a letter (a-z, but also letters with diacritical marks and non-Latin letters) or an underscore (_). Subsequent characters in an identifier or key word can be letters, underscores, digits (0-9), or dollar signs ($). Note that dollar signs are not allowed in identifiers according to the letter of the SQL standard, so their use might render applications less portable

Это происходит из Postgre док, а потому, что Postgre очень близко к «идеальному» синтаксис SQL, это может быть то же самое для MySQL ... Так нет скобки в именах столбцов, без пробелов ...

А во-вторых, имена столбцов не являются строками:

следующий синтаксис правомерен:

CREATE TABLE (test VARCHAR(100) NOT NULL, ...) 

И следующий один недействителен и выбросит ошибку синтаксиса:

CREATE TABLE ('test' VARCHAR(100) NOT NULL, ...) 

При использовании в «% S» модификатор, он анализирует данные в виде строки. так что окружает его в кавычки, что является недействительным ...

Так создать таблицу, я предлагаю «цикл», который проверки данных (с RegExpr), и symply добавить его в строку:

import re 
# ... 
query = "CREATE TABLE test (ID INT AUTO_INCREMENT,name VARCHAR(50)" 
for c in columnames: 
     if (re.search(r"^[A-Za-z][A-Za-z0-9_]*$", c) query += c + ", FLOAT" #this regex validate string if it begins with alphabetic char (upper or lower case), and if the others characters are alphanumeric, or are underscores 
     else raise SyntaxError("Invalid Column name!!") #If not, we raise a syntax error 
query += ");" 

и тогда вы можете создать свой стол :)

+0

Благодарим вас за ввод. Я отредактировал сообщение, но, как я вижу, вы публикуете еще несколько входов одновременно ... я перепроверю код. –

0

здесь решение

columnames=[element[0] for element in bufferdata['data'] ] 
    queryCT="CREATE TABLE test (ID INT AUTO_INCREMENT primary key,name VARCHAR(50),symbol VARCHAR(10),sector VARCHAR(50)" 
    for c in columnames: 
     queryCT += "," + str(re.sub("[(%./)-]","",c)).replace(' ','') + " FLOAT" 
    queryCT += ")" 

    print queryCT 
    try: 
     self.cursor.execute(queryCT) 
    except MySQLdb.ProgrammingError, e: 
     try: 
      print "MySQL Error [%d]: %s" % (e.args[0], e.args[1]) 
     except IndexError: 
      print "MySQL Error: %s" % str(e) 

идея BILD строку запроса, а затем отправить его в cursor.execute работает.

Смежные вопросы