python mysql 查询错误

python mysql error in query

我要生成动态table:

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 错误 [1064]:您的 SQL 语法有误;查看与您的 MySQL 服务器版本对应的手册,了解在 ''SALES in millions' FLOAT,'Earnings per share' FLOAT,'PE Ratio TTM' FLOAT,'PE Hi' 附近使用的正确语法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 非常接近 "ideal" SQL 语法,所以 mysql 可能是相同的...所以列中没有括号名称,没有空格...

其次,列名不是字符串 :

以下语法有效:

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

下面的无效,会抛出语法错误:

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

当您使用“%s”修饰符时,它会将数据解析为 STRING。所以它用引号括起来,这是无效的...

因此,为了创建您的 table,我建议使用 "for loop" 来验证数据(使用正则表达式),并将其简单地添加到字符串中:

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 += ");"

然后你可以创建你的 table :)

这里是解决方案

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)

构建查询字符串然后将其发送到 cursor.execute 的想法非常有效。