Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python更新SQLite列中的多个值_Python_Sqlite - Fatal编程技术网

使用Python更新SQLite列中的多个值

使用Python更新SQLite列中的多个值,python,sqlite,Python,Sqlite,我有一个具有固定行数的SQLite表。但是,当我从这些列(新特性)中生成值时,我希望在现有列旁边动态添加列,而不创建任何新行。我可以使用altertable添加一列,但是调用cur.executemany(“插入到…”)会将值追加到新行中 我试过: cur.executemany(“更新DOS_附录集功能2=?”,[(val,)用于[“a”、“b”、“c”]]中的val) 出于某种原因,这会导致在列FEATURE2中的第1、2、3行中重复“c”。而且在一张大名单上(约200万)的速度很慢 有办法

我有一个具有固定行数的SQLite表。但是,当我从这些列(新特性)中生成值时,我希望在现有列旁边动态添加列,而不创建任何新行。我可以使用
altertable
添加一列,但是调用
cur.executemany(“插入到…”)
会将值追加到新行中

我试过:

cur.executemany(“更新DOS_附录集功能2=?”,[(val,)用于[“a”、“b”、“c”]]中的val)

出于某种原因,这会导致在列
FEATURE2
中的第1、2、3行中重复“c”。而且在一张大名单上(约200万)的速度很慢

有办法批量更新吗?像调用
cur.executemany(插入到…)
这样优雅而快速的东西

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

如果是这样,如果没有
WHERE
条件(仅行数),我将如何执行此操作

注意:在现有列旁边创建一个并行列时会出现空值。然后这些文件被覆盖

  • 如果使用
    UPDATE tbl SET column='value'
    ,则在该
    列的所有行中都会获得
    值。这正是这个查询所做的。如果只想在特定行(或特定列)上设置值,则应相应地更改查询(使用
    where column1='some value'
    或更改列名)
  • 如果更新一个有大约200万行的表-取决于数据量,这需要时间:)如果您(它非常旧,现在可能快多了),您可以看到sqlite中更新25K行花费了2.4秒(现在是80的两倍)。大型更新需要时间
  • 你可以使用批量更新,但是我不确定你到底想做什么。如果要将column2设置为value2,其中column1=value1,则可以使用:

  • 一般来说,当你说“我没有
    WHERE
    条件(仅行数)”时,这是非常有问题的。如果您确切知道要更新哪些行,则可以使用,但是行的顺序可能会更改,因此我建议您不要这样做。最好在行中添加
    id
    ,并将其与
    UPDATE
    查询一起使用

  • 如果使用
    UPDATE tbl SET column='value'
    ,则在该
    列的所有行中都会获得
    值。这正是这个查询所做的。如果只想在特定行(或特定列)上设置值,则应相应地更改查询(使用
    where column1='some value'
    或更改列名)
  • 如果更新一个有大约200万行的表-取决于数据量,这需要时间:)如果您(它非常旧,现在可能快多了),您可以看到sqlite中更新25K行花费了2.4秒(现在是80的两倍)。大型更新需要时间
  • 你可以使用批量更新,但是我不确定你到底想做什么。如果要将column2设置为value2,其中column1=value1,则可以使用:


  • 一般来说,当你说“我没有
    WHERE
    条件(仅行数)”时,这是非常有问题的。如果您确切知道要更新哪些行,则可以使用,但是行的顺序可能会更改,因此我建议您不要这样做。最好在行中添加
    id
    ,并将其用于
    UPDATE
    查询。

    在关系数据库中,您可能不想执行所描述的操作,因为它会中断

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

    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
    表中来添加新功能。

    在关系数据库中,您可能不想执行所描述的操作,因为它会中断

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

    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
    表中来添加新功能。

    我预计
    UPDATE
    需要更长的时间,因为它会覆盖空值。但我希望这不会比插入时间长太多(这很快,即使有200万条记录)。也许这是对DB的非常规使用(改变其结构),但我希望在计算新特性时存储它们的值。我将尝试添加一个
    id
    ,并将其作为相对于删除并重新创建具有新列的表的基准。谢谢。当你说你预计不会花太多时间的时候-你试过插入2M行吗?花了多少时间?是的。最多几秒钟。过了一分钟后,更新仍然没有完成,这对我的处理器造成了负担,所以我终止了它。所以你实际上在一个200万行的表上做了200万次更新。。。这真的离我们很远;)@zadrozny如果您不想创建多个表,那么您使用了错误的工具。也许一个面向列的db或类似HDF5的东西会更好地满足您的需求?类似于pytables?我希望
    UPDATE
    需要更长的时间,因为它会覆盖空值。但我希望这不会比插入时间长太多(这很快,即使有200万条记录)。也许这是对DB的非常规使用(改变其结构),但我希望在计算新特性时存储它们的值。我将尝试添加一个
    id
    ,并将其作为相对于删除并重新创建具有新列的表的基准。谢谢。当你说你预计不会花太多时间的时候-你试过插入2M行吗?花了多少时间?是的。最多几秒钟。更新在超过一分钟后仍然没有完成,并且很费力