Python SQLite使用for循环添加多个列

Python SQLite使用for循环添加多个列,python,sqlite,alter-table,Python,Sqlite,Alter Table,我正在尝试创建一个SQL数据库,它将有许多列(大约4030列)。因此我不能使用 ALTER TABLE table_name ADD column_name 对于每一列。现在我尝试执行多个ALTER TABLE操作,但我知道,分支中没有循环,因此不允许重复。所以我尝试了另一种方法来实现我的表。我试过了 c.execute('''ALTER TABLE table_name ADD (?) ''',k) #k changes in every iteration 我在下面写的代码 import

我正在尝试创建一个SQL数据库,它将有许多列(大约4030列)。因此我不能使用

ALTER TABLE table_name ADD column_name
对于每一列。现在我尝试执行多个ALTER TABLE操作,但我知道,分支中没有循环,因此不允许重复。所以我尝试了另一种方法来实现我的表。我试过了

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中不允许执行
altertable\u name ADD(?),k
命令

控制台中的消息是这样的。如何在一个命令中添加多个列

       c.executemany('''ALTER TABLE table_name ADD (?) ''',k)

OperationalError: near "(": syntax error

谢谢您的建议。

只有您第一次提到ALTER TABLE命令是正确的:您不能使用括号

而且不能对表/列名使用参数。必须将列名直接放入SQL命令字符串中(如果列名不是有效标识符):

不必为每一列执行一个命令,只需构造包含所有列的CREATE TABLE命令即可:

sql = "CREATE TABLE tab (ID INTEGER PRIMARY KEY," + ",".join(matFile) + ")"

现在是2000年,所以无论如何你都不能这么做。您应该正确地规范化数据库结构。

只有您第一次提到的ALTER TABLE命令是正确的:您不能使用括号

而且不能对表/列名使用参数。必须将列名直接放入SQL命令字符串中(如果列名不是有效标识符):

不必为每一列执行一个命令,只需构造包含所有列的CREATE TABLE命令即可:

sql = "CREATE TABLE tab (ID INTEGER PRIMARY KEY," + ",".join(matFile) + ")"

现在是2000年,所以无论如何你都不能这么做。您应该正确地规范化数据库结构。

SQL的概念是数据定义语言与数据管理语言()。当日期插入、修改、提取或抑制是DML指令时,与表、索引或其他元数据元素相关的所有语句都是数据定义语言指令。参数化查询只能在DML中使用,不能在DDL中使用。这就是为什么您必须将ALTER TABLE(或CREATE TABLE)命令构建为字符串并执行该字符串的原因,因为很多次您都被告知应该在SQL中始终使用参数化查询。但该规则仅适用于DML

顺便说一句,ALTERTABLE可能是一个昂贵的操作,您不应该将其放入循环:将所有列放入一条CREATETABLE指令中,如CL.的答案所示

但是,如果需要超过2000列,则应该为数据库使用不同的设计。事实上,一百已经太多了,这是一个糟糕设计的标志


一种常见的模式是这样设计表:键、类型、值(最终是其他列,如DATE、INSERT_DATE…)。在这里,您可以使用KEY、SIGNAL\u ID、VALUE、…

SQL的概念是数据定义语言与数据管理语言()。当日期插入、修改、提取或抑制是DML指令时,与表、索引或其他元数据元素相关的所有语句都是数据定义语言指令。参数化查询只能在DML中使用,不能在DDL中使用。这就是为什么您必须将ALTER TABLE(或CREATE TABLE)命令构建为字符串并执行该字符串的原因,因为很多次您都被告知应该在SQL中始终使用参数化查询。但该规则仅适用于DML

顺便说一句,ALTERTABLE可能是一个昂贵的操作,您不应该将其放入循环:将所有列放入一条CREATETABLE指令中,如CL.的答案所示

但是,如果需要超过2000列,则应该为数据库使用不同的设计。事实上,一百已经太多了,这是一个糟糕设计的标志


一种常见的模式是这样设计表:键、类型、值(最终是其他列,如DATE、INSERT_DATE…)。这里可以有键、信号、ID、值、

c.execute(''ALTER TABLE\u name ADD''+k)
为什么要以这种方式构建表?另外,您是否知道sqlite默认最多有2000列?你需要更新这个限制。不,我不知道这个事实。但是真的。。。4030列?您确定这是一种很好的数据格式吗?你想做什么?事实上,我有4030个不同的信号,每天,信号的值都在变化,新的值也在增加,所以我认为这是创建表的最佳方式。
c.execute('ALTER table table_name ADD'+k)
为什么要用这种方式构建表?另外,您是否知道sqlite默认最多有2000列?你需要更新这个限制。不,我不知道这个事实。但是真的。。。4030列?您确定这是一种很好的数据格式吗?你们想做什么?实际上,我有4030个不同的信号,每天,信号的值都在变化,新的值也在增加,所以我认为这是创建表的最好方法。谢谢你们的解决方案。这两种方法都很有效。现在,为了提高效率,我正在尝试减少列数。感谢您的解决方案。这两种方法都很有效。现在,为了提高效率,我正在尝试减少列数。谢谢。我将避免在循环中使用ALTERTABLE。在SQLite中,ALTERTABLE从来都不昂贵(因为它不能做很多事情)。谢谢。我将避免在循环中使用ALTERTABLE。在SQLite中,ALTERTABLE从来都不昂贵(因为它不能做很多事情)。