configurer sqlite

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

bonjour,

J'aimerais pouvoir augmenter la longueur de mes requetes à l'aide de SQLITE_MAX_SQL_LENGTH. Cependant, ou est-ce que cela se modifie dans sqlite ?

cordialement, albert

Édité par albert733

+0 -0
Auteur du sujet

je sais que c'est déconseiller mais j'ai un programme ou je dois insérer 13500 fois 127000 ligne dans une table donc pour que ca prenne moins de temps j'aimerais augmenter cette valeur.

+0 -0

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 ?

Anciennement Sorrow

+0 -0

Cette réponse a aidé l'auteur du sujet

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 !

Édité par Bawi

Anciennement Sorrow

+1 -0
Auteur du sujet

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

Édité par albert733

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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