Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
如何使用SQLite进行大容量插入?_Sqlite_Ado.net_Bulkinsert - Fatal编程技术网

如何使用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

如何使用SQLite进行大容量插入

我查了一下,好像我用select语句做了一个insert。我在谷歌上搜索,查看了这些示例,它们看起来都像是在将数据从一个表复制到另一个表,或者与SQLite不兼容。我想做一些像

"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"