SQLite使用for循环添加多个列

问题描述 投票:0回答:2

我正在尝试创建一个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

谢谢你的建议。

python sqlite alter-table
2个回答
2
投票

只有您第一次提到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,所以无论如何你都无法做到这一点。您应该正确地规范化数据库结构。


0
投票

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,......

© www.soinside.com 2019 - 2024. All rights reserved.