SQLite 使用 for 循环添加多列
SQLite add multiple columns using for loop
我正在尝试创建一个 SQL 数据库,它将有很多列(大约 4030)。因此我不能使用
ALTER TABLE table_name ADD column_name
对于每一列。现在我正在尝试执行多个 ALTER TABLE 操作,但我知道 ADD 分支中没有循环,因此不允许重复。所以我尝试了另一种方法来实现我的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 中不允许执行 ALTER TABLE table_name ADD (?),k
命令。
控制台中的消息是这样的。如何在单个命令中添加多个列?
c.executemany('''ALTER TABLE table_name ADD (?) ''',k)
OperationalError: near "(": syntax error
谢谢您的指点。
只有你第一次提到的 ALTER TABLE 命令是正确的:你不能使用括号。
并且无法为 table/column 名称使用参数。您必须将列名直接放入 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.)。所有与tables、索引或其他元数据元素相关的语句都是数据定义语言指令,当日期插入、修改、提取或抑制是DML时。参数化查询只能在 DML 中使用,不能在 DDL 中使用。这就是为什么你必须将 ALTER TABLE(或 CREATE TABLE)命令构建为字符串并执行该字符串的原因,当你多次被告知你应该始终在 [=23 中使用参数化查询时=].但该规则仅适用于 DML。
顺便说一句,ALTER TABLE 可能是一项昂贵的操作,您不应该将其放入循环中:将所有列放在一个 CREATE TABLE 指令中,如 CL. 的回答所示。
但是如果您需要超过 2000 列,您应该为您的数据库使用不同的设计。事实上,一百已经太多了,而且是糟糕设计的标志。
一个常见的模式是像这样设计 table:KEY、TYPE、VALUE,(最终是其他列,如 DATE、INSERT_DATE...)。在这里你可以有 KEY, SIGNAL_ID, VALUE, ...
我正在尝试创建一个 SQL 数据库,它将有很多列(大约 4030)。因此我不能使用
ALTER TABLE table_name ADD column_name
对于每一列。现在我正在尝试执行多个 ALTER TABLE 操作,但我知道 ADD 分支中没有循环,因此不允许重复。所以我尝试了另一种方法来实现我的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 中不允许执行 ALTER TABLE table_name ADD (?),k
命令。
控制台中的消息是这样的。如何在单个命令中添加多个列?
c.executemany('''ALTER TABLE table_name ADD (?) ''',k)
OperationalError: near "(": syntax error
谢谢您的指点。
只有你第一次提到的 ALTER TABLE 命令是正确的:你不能使用括号。
并且无法为 table/column 名称使用参数。您必须将列名直接放入 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.)。所有与tables、索引或其他元数据元素相关的语句都是数据定义语言指令,当日期插入、修改、提取或抑制是DML时。参数化查询只能在 DML 中使用,不能在 DDL 中使用。这就是为什么你必须将 ALTER TABLE(或 CREATE TABLE)命令构建为字符串并执行该字符串的原因,当你多次被告知你应该始终在 [=23 中使用参数化查询时=].但该规则仅适用于 DML。
顺便说一句,ALTER TABLE 可能是一项昂贵的操作,您不应该将其放入循环中:将所有列放在一个 CREATE TABLE 指令中,如 CL. 的回答所示。
但是如果您需要超过 2000 列,您应该为您的数据库使用不同的设计。事实上,一百已经太多了,而且是糟糕设计的标志。
一个常见的模式是像这样设计 table:KEY、TYPE、VALUE,(最终是其他列,如 DATE、INSERT_DATE...)。在这里你可以有 KEY, SIGNAL_ID, VALUE, ...