如何使用SQLite进行大容量插入?
如何使用SQLite进行大容量插入 我查了一下,好像我用select语句做了一个insert。我在谷歌上搜索,查看了这些示例,它们看起来都像是在将数据从一个表复制到另一个表,或者与SQLite不兼容。我想做一些像如何使用SQLite进行大容量插入?,sqlite,ado.net,bulkinsert,Sqlite,Ado.net,Bulkinsert,如何使用SQLite进行大容量插入 我查了一下,好像我用select语句做了一个insert。我在谷歌上搜索,查看了这些示例,它们看起来都像是在将数据从一个表复制到另一个表,或者与SQLite不兼容。我想做一些像 "INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_media_date) " + "VALUES(@mediaId, @catagory, @current_media_date)"; where
"INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_media_date) " +
"VALUES(@mediaId, @catagory, @current_media_date)";
where the value of recipientId is the watcher from each of
"SELECT watcher FROM userwatch WHERE watched=@watched";
我尝试了下面的代码,得到了错误“SQLite error no-this column:watcher”
SQlite不支持@variable表示法,但是(为了清晰起见,使用SQlite的Python绑定支持的命名占位符样式),这应该可以:
INSERT INTO user_msg_media (userId, mediaId, catagory, current_media_date)
SELECT watcher, :mediaId, :category, :current_media_date
FROM userwatch WHERE watched=:watched
编辑:SQLite似乎误判了列名的错误。在列名都已修复的情况下,以下Python代码适合我(不确定您使用的是什么其他语言,Python是我与sqlite交互最方便的语言):
但是如果我在您的SQL中重现不匹配的情况,例如当前日期与当前媒体日期,我可以让它错误地诊断缺少的列是
watcher
,即使该列实际上没有问题。想试着把这段修改过的代码放回你最喜欢的语言中,看看它是如何工作的吗?我编写了一个类来帮助在SQLite中进行批量插入。希望它能有所帮助:
-JP我建议使用StackOverflow的朋友提供的。如果你看一下关于性能的部分,你不会比整洁更快
多次执行命令同样的签名还允许您方便高效地多次执行命令(例如批量加载数据) 用法示例:
connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)",
new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } }
); // 3 rows inserted: "1,1", "2,2" and "3,3"
这适用于为某些T实现IEnumerable的任何参数。这表明您的一个列名拼写错误-那么TABLE
user\u msg\u media
的CREATE TABLE
语句是什么?(即,假设您使用的任何语言对占位符使用与pysqlite相同的语法,并且您也传递了正确的dict、hash或其他内容)…CREATE TABLE
statement for user\u msg\u media!?!它不是在userwatch中查找吗?我会在谢谢你的帮助下编辑这两个表!它很有效!不仅用于解释如何操作,还用于查找我的错误。有2,1):当前的\u media\u日期“+”来自“您使用的是System.Data.Sqlite吗?请注意,创建表usr_msg_media会生成一个名为current_date的列,但INSERT会尝试设置current_media_date:我相信Sqlite会误诊此错误(它会混淆,并声称缺少的列是watcher),因为我可以重现错误的错误消息,但是如果我修复了实际的错误,它就可以工作了,请参阅我答案中的Python示例代码。哈哈,已经晚了2.5年了。然而,我正在使用整洁(或选择)和我自己的orm(用于其他一切),它踢出了亚音速和其他垃圾所谓的ormsI的屁股,我很高兴听到你在整洁方面取得了成功。我只是建议将其包含在我们的生产应用程序中。
import sqlite3 as sq
con = sq.connect(':memory:')
cur = con.cursor()
cur.execute("CREATE TABLE if not exists user_msg_media( " +
"msgId INTEGER PRIMARY KEY, " +
"recipientId INTEGER, " +
"mediaId INTEGER, " +
"catagory INTEGER, " +
"current_date DATE)")
cur.execute("CREATE TABLE if not exists user_watch( " +
"indx INTEGER PRIMARY KEY, " +
"watcher INTEGER, " +
"watched INTEGER)")
cur.execute("INSERT INTO user_watch VALUES (1, 2, 3)")
cur.execute("SELECT watcher FROM user_watch WHERE watched=:watched",
dict(watched=3))
print cur.fetchall()
print cur.execute("INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_date) " +
"SELECT watcher, :mediaId, :category, :current_media_date " +
"FROM user_watch WHERE watched=:watched;",
dict(mediaId=0, category=0, current_media_date=0, watched=3)
)
cur.execute("SELECT * FROM user_msg_media")
print cur.fetchall()
connection.Execute(@"insert MyTable(colA, colB) values (@a, @b)",
new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } }
); // 3 rows inserted: "1,1", "2,2" and "3,3"