使用Python更新SQLite列中的多个值
我有一个具有固定行数的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万)的速度很慢 有办法
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'
或更改列名)
一般来说,当你说“我没有
WHERE
条件(仅行数)”时,这是非常有问题的。如果您确切知道要更新哪些行,则可以使用,但是行的顺序可能会更改,因此我建议您不要这样做。最好在行中添加id
,并将其与UPDATE
查询一起使用
UPDATE tbl SET column='value'
,则在该列的所有行中都会获得值。这正是这个查询所做的。如果只想在特定行(或特定列)上设置值,则应相应地更改查询(使用where column1='some value'
或更改列名)
一般来说,当你说“我没有
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行吗?花了多少时间?是的。最多几秒钟。更新在超过一分钟后仍然没有完成,并且很费力