使用Python

时间:2016-10-30 13:26:15

标签: python sqlite

我有一个具有常量行数的SQLite表。但是当我生成从其中一些列(新功能)派生的值时,我希望在现有列的同时添加列,而不创建任何新行。我可以使用ALTER TABLE添加列,但调用cur.executemany("INSERT INTO...")会导致值附加到新行中。

我试过了:

cur.executemany("UPDATE DOS_APPENDIX SET FEATURE2=?", [(val,) for val in ["a", "b", "c"]])

由于某种原因,这会导致" c"要在列FEATURE2中的第1,2,3行中重复。它在一个大的名单上很慢(约200万)。

有没有办法进行批量更新?像调用cur.executemany(INSERT INTO...)那样优雅而快速的东西?

我是否必须使用for循环逐个更新行?

如果是这样,如果我没有WHERE条件(只有行号),我该怎么做?

注意:并行列与现有列一起创建时带有空值。然后这些被覆盖。

2 个答案:

答案 0 :(得分:3)

在关系数据库中,您可能不想做您所描述的内容,因为它会中断normalization

我建议您有一个功能表,用于存储每行的功能:

CREATE TABLE observations (id INTEGER);
CREATE TABLE features (id INTEGER, name TEXT);
CREATE TABLE values (row_id INTEGER, feature_id INTEGER, value FLOAT);

这样,您可以通过向features表添加一行以及向values表添加所有相应行来添加新功能。

答案 1 :(得分:2)

  1. 如果您使用UPDATE tbl SET column='value',则会在value的所有行中获得column。这正是此查询的作用。如果要仅在特定行(或特定列)上设置值,则应相应地更改查询(使用where column1='some value'或更改列名称。
  2. 如果你用~2M行更新一个表 - 根据数据量,需要时间:)如果你take a look here很老,可能事情很多现在更快),你可以看到sqlite中25K行的更新花费了2.4秒(现在它加倍了80)。大型更新需要时间。
  3. 您可以使用批量更新,但我不确定您到底想要做什么。如果要将column2设置为value2,其中column1 = value1,您可以使用:

  4. cur.executemany("UPDATE DOS_APPENDIX SET column2=? WHERE column1=?", [(column2_val, column1_val) for ...])
    

    一般情况下 - 当你说“我没有WHERE条件(只有行号)”时 - 这是非常有问题的。如果您确切知道要更新哪些行,则可以使用limit,但行的顺序可能会发生变化,因此我建议您不要这样做。向您的行添加id并将其与UPDATE查询一起使用会更好。