我想生成一个动态表:
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行附近使用
有没有人知道问题出在哪里?
答案 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的想法很有效。