configurer sqlite

Le problème exposé dans ce sujet a été résolu.

Tu n'as pas moyen d'utiliser des requêtes préparées comme conseillé dans le même paragraphe ?

Heu sinon tu dois réellement insérer autant de fois les mêmes lignes ? Genre … identiques ? Pourquoi ne pas dupliquer simplement la première table plusieurs fois ?

+0 -0

Avec les requêtes préparées seules non. Il va falloir les coupler avec les transactions. En gros tu va ouvrir ta transaction, décrire ta requête, boucler sur tes données et sur la requête et valider à la fin pour tout insérer d'un coup.

Sur le principe ça va donner un truc comme ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
char* errorMessage;
sqlite3_exec(mDb, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);

char buffer[] = "INSERT INTO example VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)";
sqlite3_stmt* stmt;
sqlite3_prepare_v2(mDb, buffer, strlen(buffer), &stmt, NULL);

for (unsigned i = 0; i < mVal; i++)
{
    std::string id = getID();
    sqlite3_bind_text(stmt, 1, id.c_str(), id.size(), SQLITE_STATIC);
    sqlite3_bind_double(stmt, 2, getDouble());
    sqlite3_bind_double(stmt, 3, getDouble());
    sqlite3_bind_double(stmt, 4, getDouble());
    sqlite3_bind_int(stmt, 5, getInt());
    sqlite3_bind_int(stmt, 6, getInt());
    sqlite3_bind_int(stmt, 7, getInt());

    if (sqlite3_step(stmt) != SQLITE_DONE)
    {
        printf("Commit Failed!\n");
    }

    sqlite3_reset(stmt);
}

sqlite3_exec(mDb, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
sqlite3_finalize(stmt);

L'exemple est imparfait, rien ne serait inséré en cas de soucis ou alors il pourrait manquer des bouts. Dans ce genre de grosses opération tu peux faire des commits intermédiaires (tous les 1000 requetes ou plus) en cas de soucis, mais il faut avoir un identifiant dans le contenu pour savoir où reprendre.

Mais ça devrait déjà te donner une direction pour avancer.

Source ici ; paragraphe « Prepared Statements »


Edit : sinon je viens d'y penser : Sqlite sait importer des données au format CSV … ça peut aider aussi !

+1 -0

merci beaucoup.

je mets le bout de code (encore plus synthétique ;) ) pour ce que ca intéresserait (c'est du ruby):

1
2
3
4
5
db.transaction
    127000.times do |i|
        db.execute "INSERT INTO filtres (image, filtre, seuil, visage, visageEntrainement) VALUES(?, ?, ?, ?, ?)", [1, i, 0.225558, 0, 1]
    end
db.commit
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte