查询

时间:2016-04-01 11:50:30

标签: python mysql sql mysql-python

我想生成一个动态表:

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服务器版本相对应的手册,以获得正确的语法,以便在''百万销售额'FLOAT,'每股收益'FLOAT,'PE比率TTM'FLOAT,'PE Hi'第2行附近使用

有没有人知道问题出在哪里?

2 个答案:

答案 0 :(得分:2)

首先,正如在此处所说:Check for valid SQL column name

  

SQL标识符和关键字必须以字母(a-z,但也包含带变音符号和非拉丁字母的字母)或下划线(_)开头。标识符或关键字中的后续字符可以是字母,下划线,数字(0-9)或美元符号($)。请注意,根据SQL标准的字母,标识符中不允许使用美元符号,因此它们的使用可能会降低应用程序的可移植性

它来自PostGre doc,但由于PostGre非常接近“理想”的SQL语法,因此对于mysql来说可能是相同的...所以没有括号到列名,没有空格......

其次,列名不是字符串

以下语法有效:

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

以下一个无效并将引发语法错误:

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

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

因此,为了创建表,我建议使用“for循环”来验证数据(使用regexpr),并将其添加到字符串中:

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

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

答案 1 :(得分: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的想法很有效。