【问题标题】:SQLite add multiple columns using for loopSQLite 使用 for 循环添加多列
【发布时间】:2023-03-11 08:32:01
【问题描述】:

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

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

感谢您的建议。

【问题讨论】:

  • c.execute('''ALTER TABLE table_name ADD '''+k)
  • 你为什么要这样建你的表?另外,您是否知道 sqlite 默认最多为 2000 列?您需要更新该限制。
  • 不,我不知道这个事实。
  • 但真的... 4030 列?您确定这是适合您数据的格式吗?你想做什么?
  • 实际上,我有 4030 个不同的信号,每天,信号的值都在变化,新的值也在附加,所以我认为这是创建表格的最佳方式。

标签: python sqlite alter-table


【解决方案1】:

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

【讨论】:

  • 感谢您的解决方案。两种方式都运作良好。现在我正在尝试减少列以提高效率。
【解决方案2】:

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

顺便说一句,ALTER TABLE 可能是一项昂贵的操作,您不应将其置于循环中:将所有列放在一个 CREATE TABLE 指令中,如 CL. 的答案所示。

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

一种常见的模式是这样设计表:KEY、TYPE、VALUE(最终还有其他列,如 DATE、INSERT_DATE...)。在这里你可以有 KEY、SIGNAL_ID、VALUE、...

【讨论】:

  • 谢谢。我会避免在循环中使用 ALTER TABLE。
  • 在 SQLite 中,ALTER TABLE 永远不会很昂贵(因为它不能做很多事情)。
猜你喜欢
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多