い方は、バルクの挿入とSQLite?
-
06-09-2019 - |
質問
い方は、バルクの挿入とSQLite?
んでいいのでは挿入を選択します。インターネットで調べについてさらに検討を事例とそのすべてのようなものだというのはコピーからデータをテーブルへの互換性はありません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エラー等のカラム:観"
command.CommandText =
"CREATE TABLE if not exists user_msg_media( " +
"msgId INTEGER PRIMARY KEY, " +
"recipientId INTEGER, " +
"mediaId INTEGER, " +
"catagory INTEGER, " +
"current_date DATE);";
command.ExecuteNonQuery();
//user media
command.CommandText =
"CREATE TABLE if not exists user_watch( " +
"indx INTEGER PRIMARY KEY, " +
"watcher INTEGER, " +
"watched INTEGER);";
command.ExecuteNonQuery();
//...
command.CommandText = "SELECT watcher FROM user_watch WHERE watched=:watched;";
command.Parameters.Add(":watched", DbType.Int64).Value = 1;
command.ExecuteNonQuery(); //is ok
command.CommandText =
"INSERT INTO user_msg_media (recipientId, mediaId, catagory, current_media_date) " +
"SELECT watcher, :mediaId, :category, :current_media_date" +
"FROM user_watch WHERE watched=:watched;";
command.Parameters.Add(":mediaId", DbType.Int64).Value = 0;
command.Parameters.Add(":category", DbType.Int64).Value = 0;
command.Parameters.Add(":current_media_date", DbType.Int64).Value = 0;
command.Parameters.Add(":watched", DbType.Int64).Value = 1;
command.ExecuteNonQuery();
解決
SQLiteは、この作業をする必要があり(明確にするためのsqliteの結合はPythonでサポートされているという名前-プレースホルダのスタイルを使用して)@Variable記法をサポートしていますが、しません。
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コードは(sqliteのと対話するために私にはPythonのものを最も便利な、あなたが使用している他のどの言語がわからない)私の作品ます:
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()
しかし、私は、このようなcurrent_media_date対CURRENT_DATEとしてあなたのSQLに不一致を再現した場合、私はそれが欠けている列は、その列は、実際の罰金であるにも関わらず、watcher
あると誤診断する得ることができます。戻ってあなたの好きな言語に、この修正されたコードを入れて試してみて、それがどのように動作するか見てみたい?
他のヒント
私はSQLiteの中に大量の挿入を容易支援するクラスを書きました。うまくいけば、それは便利です。
http://procbits.com/2009/09/08/sqlite -bulk-挿入/ の
-jp
私はあなたが使用 Dapper ORM からの友人でStackOverflow.場についての説明は、上記の性能を取得しませんよりはるかに早くDapper.
実行コマンドを複数回
同じ署名をすることもでき便利に、効率的に実行するコマンドを複数回(例えばバルク負荷データ)
使用例:
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"
この作品の他のパラメータを実装したIEnumerable一也