2009-05-30 17 views
7

¿Cómo puedo insertar a granel con SQLite?¿Cómo puedo insertar a granel con SQLite?

Lo busqué y parece que hago una inserción con una declaración de selección. Busqué en Google, miré los ejemplos y todos parecen copiar datos de una tabla a otra o no son compatibles con SQLite. Quiero hacer algo como

"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 [email protected]"; 

Probé el código abajo y me sale el error "error de SQLite ninguna columna de este tipo: vigilante"

 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(); 
+0

¿Está utilizando System.Data.Sqlite? –

+0

Tenga en cuenta que CREATE para la tabla usr_msg_media crea una columna denominada current_date, pero INSERT intenta establecer current_media_date en su lugar: creo que este error está siendo mal diagnosticado por SQLite (se confunde y dice que la columna que falta es watcher), ya que puedo reproducir mensaje de error erróneo - pero si soluciono el error real, funciona, vea el código de ejemplo de Python en mi respuesta. –

Respuesta

2

SQlite no soporta la notación @ variable, pero (usando el estilo-nombrado como marcador de posición apoyada por el enlace de Python de SQLite para mayor claridad) esto debería funcionar:

INSERT INTO user_msg_media (userId, mediaId, catagory, current_media_date) 
SELECT watcher, :mediaId, :category, :current_media_date 
FROM userwatch WHERE watched=:watched 

Editar: SQLite parece estar mal diagnóstico de lo que la columna nombre es incorrecto. Con los nombres de columna instalados todos ellos, el siguiente código Python funciona para mí (no sé qué otro idioma que está utilizando, Pitón de lo más práctico para mí para interactuar con sqlite):

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() 

Pero si reproduzco desajustes en su SQL como current_date vs current_media_date, puedo hacer que mis-diagnostique que la columna faltante es watcher, aunque esa columna está realmente bien. ¿Desea volver a poner este código corregido en su idioma favorito y ver cómo se comporta?

+0

Lo probé, recibí un error de columna no. –

+0

Eso sugiere que uno de los nombres de sus columnas se deletrea incorrectamente - ¿cuál es entonces la declaración 'CREATE TABLE' para la tabla' user_msg_media'? –

+0

(es decir, suponiendo que el lenguaje que está utilizando utiliza la misma sintaxis para marcadores de posición que pysqlite y también está pasando el dict, hash o cualquier otro) ... –

1

se recomienda usar Dapper ORM de nuestros amigos en StackOverflow. Si miras la sección de rendimiento, no puedes obtener mucho más rápido que Dapper.

ejecutar un comando varias veces
La misma firma también le permite ejecutar convenientemente y eficientemente un comando varias veces (por ejemplo, a los datos de mayor carga)

uso

Ejemplo:

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" 

Esto funciona para cualquier parámetro que implemente IEnumerable para algunos T.

+0

jaja, de 2.5 años hasta tarde. Sin embargo, soy usando dapper (o selecciona) y mi propio orm (para todo lo demás) que saca el culo de los sonidos subsónicos y los otros crash llamados orms –

+1

Me alegra saber que estás teniendo éxito con Dapper. Solo lo recomendé para su inclusión en nuestra producción solicitud. – BrokeMyLegBiking

Cuestiones relacionadas