我必须使用Django的ORM将8000多条记录插入到SQLite数据库中.此操作需要每分钟大约运行一次cronjob.
目前我正在使用for循环迭代所有项目,然后逐个插入它们.
例:
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
Run Code Online (Sandbox Code Playgroud)
这样做的有效方法是什么?
编辑:两种插入方法之间的一点比较.
没有commit_manually装饰器(11245条记录):
nox@noxdevel marinetraffic]$ time python manage.py insrec
real 1m50.288s
user 0m6.710s
sys 0m23.445s
Run Code Online (Sandbox Code Playgroud)
使用commit_manually decorator(11245条记录):
[nox@noxdevel marinetraffic]$ time python manage.py insrec
real 0m18.464s
user 0m5.433s
sys 0m10.163s
Run Code Online (Sandbox Code Playgroud)
注意:除了插入数据库之外,测试脚本还执行一些其他操作(下载ZIP文件,从ZIP存档中提取XML文件,解析XML文件),因此执行所需的时间不一定代表插入所需的时间记录.
我需要的是使用特定键设置记录的所有字段的值(键实际上是复合键),如果没有带有这样键的记录则插入记录.
REPLACE似乎意味着要做的工作,但同时它的手册页建议
INSERT ... ON DUPLICATE KEY UPDATE.
我应该更好地选择什么?为什么?
REPLACE我想到的唯一"副作用" 是它会增加自动增量值(幸运的是我不使用任何),而INSERT ... ON DUPLICATE KEY UPDATE可能不会.要记住的其他实际差异是什么?在哪些特定情况下可以REPLACE优先考虑INSERT ... ON DUPLICATE KEY UPDATE,反之亦然?
我只是在 Flutter 中创建一个简单的 ToDo 应用程序。我正在管理列表中的所有待办事项。我想在列表的开头添加任何新的待办事项。我能够使用这种解决方法来实现这一目标。有没有更好的方法来做到这一点?
void _addTodoInList(BuildContext context){
String val = _textFieldController.text;
final newTodo = {
"title": val,
"id": Uuid().v4(),
"done": false
};
final copiedTodos = List.from(_todos);
_todos.removeRange(0, _todos.length);
setState(() {
_todos.addAll([newTodo, ...copiedTodos]);
});
Navigator.pop(context);
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用以下模式创建的表:
CREATE TABLE [dbo].[Visualizations]
(
VisualizationID int identity (1,1) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
由于表没有可设置的字段,我不知道如何插入记录.我试过了:
INSERT INTO [Visualizations];
INSERT INTO [Visualizations] () VALUES ();
Run Code Online (Sandbox Code Playgroud)
都没有工作.这样做的正确语法是什么?
编辑:由于很多人似乎对我的表感到困惑,因此它纯粹用于表示多个子表的父级...每个子表都用FK引用这个表,每个FK都是PK,所以在所有子表中在这些表中,ID是唯一的.
是否可以使用这样的文字扩展查询结果?
select name from users
union
select name from ('JASON');
Run Code Online (Sandbox Code Playgroud)
要么
select age, name from users
union
select age, name from (25,'Betty');
Run Code Online (Sandbox Code Playgroud)
所以它返回表中的所有名称加'JASON'或(25,'Betty').
我有这样一张桌子:
create table1 (field1 int,
field2 int default 5557,
field3 int default 1337,
field4 int default 1337)
Run Code Online (Sandbox Code Playgroud)
我想插入一个具有field2和field4默认值的行.
我已经尝试insert into table1 values (5,null,10,null)但它不起作用ISNULL(field2,default)也不起作用.
当我插入行时,如何告诉数据库使用列的默认值?
我有许多记录需要插入到多个表中.每隔一列都是常数.
下面的伪代码很差 - 这就是我想要做的:
create table #temp_buildings
(
building_id varchar(20)
)
insert into #temp_buildings (building_id) VALUES ('11070')
insert into #temp_buildings (building_id) VALUES ('11071')
insert into #temp_buildings (building_id) VALUES ('20570')
insert into #temp_buildings (building_id) VALUES ('21570')
insert into #temp_buildings (building_id) VALUES ('22570')
insert into property.portfolio_property_xref
( portfolio_id ,
building_id ,
created_date ,
last_modified_date
)
values
(
34 ,
(
select building_id
from #temp_buildings
) ,
getdate() ,
null
)
Run Code Online (Sandbox Code Playgroud)
意图:对#temp_buildings上的每条记录执行insert.portfolio_property_xref插入
我想我可以用光标做到这一点 - 但相信这会非常慢.由于这个练习将来可以重复,我宁愿用更快的方法解决这个问题,但我不确定如何.对于任何反馈,我们都表示感谢!
好的......这是一个垒球问题......
我只需要能够将键/值对插入到特定位置的对象中.我目前正在使用Hashtable,当然,这不允许使用此功能.什么是最好的方法?
更新:此外,我确实需要能够通过密钥查找.
例如......过度简化和伪编码但应该传达这一点
// existing Hashtable
myHashtable.Add("somekey1", "somevalue1");
myHashtable.Add("somekey2", "somevalue2");
myHashtable.Add("somekey3", "somevalue3");
// Some other object that will allow me to insert a new key/value pair.
// Assume that this object has been populated with the above key/value pairs.
oSomeObject.Insert("newfirstkey","newfirstvalue");
Run Code Online (Sandbox Code Playgroud)
提前致谢.
众所周知,SQLite 需要经过精细调整,以实现大约50k插入/秒的插入速度.这里有很多关于缓慢插入速度和大量建议和基准的问题.
还有声称SQLite可以处理大量数据,50 GB以上的报告不会导致正确设置出现任何问题.
我已经按照这里和其他地方的建议来实现这些速度,我很高兴35k-45k插入/秒.我遇到的问题是所有的基准测试只能显示<1m记录的快速插入速度.我所看到的是插入速度似乎与表格大小成反比.
我的用例要求[x_id, y_id, z_id]在链接表中存储500米到1b元组()几年(1米行/天).值均为介于1和2,000,000之间的整数ID.有一个索引z_id.
前10米行的性能非常好,约35k插入/秒,但是当表有~20m行时,性能开始下降.我现在看到大约100个插入/秒.
桌子的大小不是特别大.对于20米行,磁盘上的大小约为500MB.
该项目是用Perl编写的.
这是SQLite中大型表的现实,还是有任何保密措施来维护 > 10m行的表的高插入率?
SQLITE_FCNTL_CHUNK_SIZE:我不知道C(?!),所以我不想仅仅为了完成这项工作而学习它.我看不到使用Perl设置此参数的任何方法.继蒂姆的建议,一个指数,尽管SQLite的的说法,它能够处理大型数据集导致越来越缓慢插入时间,我进行以下设置的基准进行比较:
cache_sizepragma:10,000page_size实用语:4,096temp_storepragma:记忆journal_modepragma:删除synchronouspragma:关闭在我的项目中,与下面的基准测试结果一样,创建了基于文件的临时表,并使用了SQLite对导入CSV数据的内置支持.然后将临时表附加到接收数据库,并使用insert-select语句插入50,000行的集合
.因此,插入时间不会将文件反映到数据库插入时间,而是反映
表到表的插入速度.考虑CSV导入时间会使速度降低25-50%(非常粗略估计,导入CSV数据不需要很长时间).
显然有一个索引会导致插入速度随着表格大小的增加而减慢.

从上面的数据可以清楚地看出,正确的答案可以分配给Tim的答案,而不是SQLite无法处理它的断言.显然,如果索引该数据集不是您的用例的一部分,它可以处理大型数据集.我一直在使用SQLite作为日志记录系统的后端,暂时 …
正如我SET在MySQL中的表中的cust_fax一样:
cust_fax integer(10) NOT NULL,
Run Code Online (Sandbox Code Playgroud)
然后我插入这样的值:
INSERT INTO database values ('3172978990');
Run Code Online (Sandbox Code Playgroud)
但后来它说
'错误1264`超出列的值
我想知道错误在哪里?我的套装?或其他?
任何答案将不胜感激!