Comment puis-je bulk insert avec SQLite?
Comment puis-je bulk insert avec SQLite?
Je l'ai regardé et il me semble que je fais un insert avec une instruction select. J'ai googlé, regardé les exemples et ils se ressemblent tous comme ils sont la copie des données d'une table à l'autre ou n'est pas compatible avec SQLite. Je veux faire quelque chose comme
"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";
J'ai essayé le code ci-dessous et je reçois le message d'erreur "erreur SQLite aucune colonne de ce type: watcher"
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();
Êtes-vous en utilisant le Système.Les données.Sqlite?
Remarque le CRÉER pour la table usr_msg_media fait une colonne nommée current_date, mais l'INSERTION tente de définir current_media_date à la place: je crois que cette erreur est d'être confondu par SQLite (ça devient confus et des revendications de la colonne manquante est l'observateur de la place), que je peux reproduire le faux message d'erreur - mais si je réparer l'erreur réelle, il fonctionne, consultez l'exemple de code Python dans ma réponse.
Remarque le CRÉER pour la table usr_msg_media fait une colonne nommée current_date, mais l'INSERTION tente de définir current_media_date à la place: je crois que cette erreur est d'être confondu par SQLite (ça devient confus et des revendications de la colonne manquante est l'observateur de la place), que je peux reproduire le faux message d'erreur - mais si je réparer l'erreur réelle, il fonctionne, consultez l'exemple de code Python dans ma réponse.
OriginalL'auteur | 2009-05-30
Vous devez vous connecter pour publier un commentaire.
SQlite ne supporte pas @variable de la notation, mais (à l'aide d'nommé espace réservé style soutenu par le binding Python de sqlite pour plus de clarté) cela devrait fonctionner:
Edit: SQLite semble être mauvais diagnostic de ce nom de la colonne qui est faux. Avec des noms de colonne fixe, le code Python suivant fonctionne pour moi (pas sûr de ce que d'autres langue que vous utilisez, Python est ce plus pratique pour moi d'interagir avec sqlite):
Mais si je reproduire des décalages dans votre SQL comme current_date vs current_media_date, je peux le faire pour mis-diagnostiquer que la colonne manquante est
watcher
, même si cette colonne est en fait très bien. Essayez d'ajouter ce code corrigé de nouveau dans votre langue préférée et voir comment il se comporte?Que suggère l'un de vos noms de colonne est mal orthographiés - quelle est la
CREATE TABLE
déclaration pour la tableuser_msg_media
alors?(c'est à dire, en supposant que quelle que soit la langue que vous utilisez utilise la même syntaxe pour les espaces réservés comme pysqlite et vous êtes aussi en passant la droite dict, de hachage, ou quoi que ce soit)...
CREATE TABLE
déclaration pour user_msg_media !?! n'est-il pas à la recherche dans userwatch? je vais modifier à la fois dansMerci!!!! il fonctionne! Non seulement pour expliquer comment faire, mais aussi pour retrouver mon bug. Il y a 2, 1) :current_media_date" + "et DE" <-- pas d'espace entre les qui a donné la fausse colonne d'erreur et l'autre était current_date avoir tort. Cela fonctionne très bien merci.
OriginalL'auteur Alex Martelli
J'ai écrit une classe pour faciliter les insertions dans SQLite. J'espère que c'est utile:
http://procbits.com/2009/09/08/sqlite-bulk-insert/
-JP
OriginalL'auteur JP Richardson
Je conseille Dapper ORM de nos amis de StackOverflow. Si vous regardez la section sur les performances, vous ne pouvez pas obtenir beaucoup plus rapide que Dapper.
Exécuter une Commande en plusieurs fois
La même signature vous permet également de facilement et efficacement exécuter une commande en plusieurs fois (par exemple pour le chargement en masse de données)
Exemple d'utilisation:
Cela fonctionne pour n'importe quel paramètre qui implémente l'interface IEnumerable pour certains T.
Je suis heureux d'entendre que vous avez du succès avec Dapper. J'ai juste recommandé pour l'inclure dans notre application en production.
OriginalL'auteur BrokeMyLegBiking