我正在尝试创建一个SQL数据库,它将包含许多列(大约4030)。所以我不能用
ALTER TABLE table_name ADD column_name
对于每一列。现在我尝试进行多个ALTER TABLE操作,但我知道,ADD分支中没有循环,因此不允许重复。所以我尝试了另一种方法来实现我的表。我试过了,
c.execute('''ALTER TABLE table_name ADD (?) ''',k) #k changes in every iteration
我在下面写的代码。
import scipy.io
import sqlite3
import os
# another irrelevant codes here...
conn = sqlite3.connect('CANBUS.db') #connection to .db
matFile = scipy.io.loadmat('folder/table.mat') #column names comes from here
c = conn.cursor() #cursor function I do not know that function well
c.execute('''CREATE TABLE IF NOT EXISTS table_name (ID integer PRIMARY KEY)''')
for k in matFile:
c.execute('''ALTER TABLE table_name ADD (?) ''',k) #k changes in every loop
我遇到一个基本上是语法错误的错误,我明白在SQLite中不允许做ALTER TABLE table_name ADD (?),k
命令。
控制台中的消息是这样的。如何在单个命令中添加多个列?
c.executemany('''ALTER TABLE table_name ADD (?) ''',k)
OperationalError: near "(": syntax error
谢谢你的建议。
只有您第一次提到ALTER TABLE命令才是正确的:您不能使用括号。
并且不能使用表/列名称的参数。您必须将列名直接放入SQL命令字符串(如果它不是有效的标识符,则为quote it):
for k in matFile:
c.execute("ALTER TABLE table_name ADD " + k)
而不是为每列执行一个命令,您可以只使用所有列构造CREATE TABLE命令:
sql = "CREATE TABLE tab (ID INTEGER PRIMARY KEY," + ",".join(matFile) + ")"
default limit on the number of columns是2000,所以无论如何你都无法做到这一点。您应该正确地规范化数据库结构。
SQL具有数据定义语言与数据管理语言(ref.)的概念。当日期插入,修改,提取或抑制是DML时,与表,索引或其他元数据元素相关的所有语句都是数据定义语言指令。参数化查询只能在DML中使用而不能在DDL中使用。这就是为什么你必须将ALTER TABLE(或CREATE TABLE)命令构建为字符串并执行该字符串的原因,当你多次被告知你应该总是在SQL中使用参数化查询时。但该规则仅适用于DML。
BTW,ALTER TABLE可能是一个昂贵的操作,你不应该把它放在循环中:将所有列放在一个单独的CREATE TABLE指令中,如CL。的答案所示。
但是,如果您需要超过2000列,则应该为数据库使用不同的设计。事实上,一百个已经太多,并且是一个糟糕设计的标志。
一个常见的模式是设计表格:KEY,TYPE,VALUE,(最终其他列如DATE,INSERT_DATE ......)。在这里你可以有KEY,SIGNAL_ID,VALUE,......