IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQLite Discussion :

setter l'option autoincrement


Sujet :

SQLite

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut setter l'option autoincrement
    Bonjour,

    J'ai migré une BDD de mysql à sqlite, seulement les champs id ont perdu leur options autoincrement ou (primary key), je cherche à le remettre via sqlite manager mais je ne vois pas comment faire... En cherchant sur le net je tombe sur des posts expliquant qu'il faut refaire la BDD, ca me surprends, c'est quand même souple sqlite..

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 102
    Points
    1 102
    Par défaut
    Bonjour,

    SQLITE est souple mais très limité sur les modifications que l'on peut apporter aux tables une fois que celles ci sont créées (http://www.sqlite.org/lang_altertable.html)

    Donc il te faut recréer tes tables avec les contraintes, cles primaires et tout et tout puis y recopier les données

    Cordialement

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour l'autoincrement, la doc de sqlite explique comment faire: http://www.sqlite.org/faq.html#q1

    Je ne sais pas ce qu'il en est avec les autres langages de programmation, mais avec Python, il y a une possibilité très puissante de provoquer des modifications de structure de la base que le sql de sqlite3 ne permet pas: on peut:
    - convertir toute la base de données en script sql (fichier texte),
    - provoquer toutes les modifications nécessaires avec un éditeur de texte, y compris dans la construction des tables,
    - puis reconstruire la nouvelle base de données en exécutant le script modifié.

    Je le fais couramment, et c'est vraiment très pratique. Si nécessaire, je pourrais mettre mon code ici.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Ca tombe bien je suis en train de me mettre au python, donc ca m'interresse

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Blo0d4x3 Voir le message
    Ca tombe bien je suis en train de me mettre au python, donc ca m'interresse
    Désolé pour le délai, mais j'avais commencé à répondre, et je me suis aperçu qu'il n'était pas possible d'écrire du code Python sur ce forum: les mots reconnus comme SQL sont mis en majuscules, et comme Python est sensible à la casse, ils ne pourraient pas s'exécuter sans correction à la main.

    Alors, j'ai mis à jour un de mes tutos qui parle de ça. Il est ici:

    http://python.jpvweb.com/mesrecettes...rde_script_sql

    Les codes sont en Python 2.7, mais les corrections à faire pour passer à Python 3 seront mineures.

    En cas de difficultés, signale les moi!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Alors, j'ai testé ton code, j'ai quelques erreurs:

    Quand je lance la conversion j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "./base2script.py", line 34, in <module>
        base2script(base, script)
      File "./base2script.py", line 26, in base2script
        for i, ligne in enumerate(cnx.iterdump()):
      File "/usr/lib/python2.7/sqlite3/dump.py", line 56, in _iterdump
        for row in query_res:
    sqlite3.OperationalError: Could not decode to UTF-8 column ''INSERT INTO "Memos" VALUES('||quote("id")||','||quote("date")||','||quote("titre2
    En fouillant sur le net, il fallait rajouter ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ry:
            cnx = sqlite3.connect(base)
            cnx.text_factory = str
    mais j'ai une nouvelle erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Traceback (most recent call last):
      File "./base2script.py", line 34, in <module>
        base2script(base, script)
      File "./base2script.py", line 27, in base2script
        f.write(u'%s\n' % (ligne,))
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 136: ordinal not in range(128)
    Je cherche à corriger..

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    J'utilise ce type de code depuis plusieurs années, et je n'ai jamais eu ce problème. Pourtant, mes bases de données contiennent des textes avec des caractères accentués. Il faut absolument en comprendre la cause.

    Comme je travaille surtout sous Windows, j'ai essayé sur Linux (Mint 16 basé sur Ubuntu), et je n'obtiens pas d'erreur non plus.

    La correction que tu proposes est connue, mais c'est elle qui te provoque la 2ème erreur.

    En effet:
    1- par defaut, sqlite3 stocke les champs "TEXT" en uft-8. On peut faire autrement, mais il faut le demander avec le PRAGMA encoding, et les choix sont limités à l'unicode (UTF-16, UTF-...).
    2- Python communique par défaut avec les bases de données sqlite3 en unicode, même avec Python 2.7.
    sauf si on fait "cnx.text_factory = str", auquel cas Python communique en utf-8.

    Pour vérifier le point 1:

    Ajoute juste après l'ouverture de la base de données les lignes suivantes:

    cur = cnx.cursor()
    cur.execute(u"PRAGMA encoding;")
    print cur.fetchone()[0]
    cur.close()
    Lors de l'exécution, ça doit afficher "UTF-8": est-ce que c'est le cas?

    Pour vérifier le point 2:

    En laissant ta ligne de correction "cnx.text_factory = str", la variable "ligne" renvoyée par cnx.iterdump() devrait être en utf-8. Mais la ligne "f.write(u'%s\n' % (ligne,))" demande donc une conversion d'encodage utf-8=>unicode qu'il faut signaler explicitement à Python (sinon: l'erreur que tu as eu). Remplace cette dernière ligne par:

    f.write(u'%s\n' % (ligne.decode("utf-8"),))
    Tu ne devrais plus avoir la 2ème erreur, mais si tu l'as encore, c'est que certains de tes champs TEXT sont avec un autre encodage ("latin1, etc..."), ce qui serait très inhabituel (en tout cas non prévu par sqlite3).

    Si c'est le cas, essaie différents encodages comme:

    f.write(u'%s\n' % (ligne.decode("latin1"),))
    Qu'en est-il?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Cas 1:
    ca m'affiche UTF-8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pi@styx ~/Documents/Sources/Python/SQLite
     % ./base2script.py
    UTF-8
    Cas 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "./base2script.py", line 35, in <module>
        base2script(base, script)
      File "./base2script.py", line 28, in base2script
        f.write(u'%s\n' % (ligne.decode("utf-8"),))
      File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xe7 in position 136: invalid continuation byte
    J'ai retrouvé la vieille base mysql d'ou viennent mes données elle est au format: MyISAM latin1_swedish_ci...

    Je vais essayé avec ça

  9. #9
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Blo0d4x3 Voir le message
    J'ai retrouvé la vieille base mysql d'ou viennent mes données elle est au format: MyISAM latin1_swedish_ci...

    Je vais essayé avec ça
    Essaie avec "latin1", parce qu'avec MySql, latin1_swedish_ci est la table de collation (=pour des comparaisons) qui correspond à la table des caractères "latin1": http://dev.mysql.com/doc/refman/5.0/...set-mysql.html.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  10. #10
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    C'est passé nickel avec latin1 .
    Je fais mes modifs et lance le second script.

    Je te tiens au courant.

    Merci

  11. #11
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    J'ai une nouvelle erreur ..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     % ./script2base.py
    Erreur dans l'exécution du script
    datatype mismatch

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Le "datatype" est le type de champ (integer, float, text, ...). Il s'agit probablement d'une erreur venant de la conversion avec MySql.

    Je te propose d'exécuter ma dernière fonction en bas de page: script2base_test. Cette fonction va exécuter ton script requête par requête, et tu sauras donc quelle requête génère l'erreur de datatype. Cela permettra de corriger directement dans le script.

    Mais dans cette fonction, tu devras neutraliser (avec un '#' devant la ligne) la ligne:

    cnx.execute("PRAGMA foreign_keys=on;") # active les clés étrangères
    Parce que tu auras sauté des étapes de mon tuto, et ça risque de générer d'autres erreurs liées aux contraintes prises dans le désordre.

    Par défaut, pour aller plus vite, la base est créée en RAM. Une fois les erreurs réparées, tu pourras reprendre la fonction précédente pour avoir ta base corrigée sur disque.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  13. #13
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    J'ai trouvé d'ou ca vient, mais pas comment le corriger:

    Ca intervient car je rajoute l'autoincrement sur le champ ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE "Badlogin" (
      "id" INTEGER PRIMARY KEY   AUTOINCREMENT ,
    ou lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE "Badlogin" (
      "id" int(11) NOT NULL ,
    Si je touche à rien dans la structure de la base ca marche nickel.

    Et l'erreur datamismath arrive quand les insert sont fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO "Badlogin" VALUES('','toto','titi','10.40.12.4','tata','14/03/30 19:42:09','test');
    Pourtant l'id est vide dans l'insert.

    J'ai pas encore trouvé comment résoudre ce hic.

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Peut-être faut-il remplacer le 1er '' par un NULL ? Comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO "Badlogin" VALUES(NULL,'toto','titi','10.40.12.4','tata','14/03/30 19:42:09','test');
    Si ça ne marche toujours pas, essaie de supprimer le AUTOINCREMENT car il est dit dans la doc que INTEGER PRIMARY KEY suffit pour faire fonctionner l'autoincrement: en insérant un NULL, sqlite3 ajoute un entier égal à l'entier le plus grand + 1.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    En laissant ""id" INTEGER PRIMARY KEY AUTOINCREMENT" et en mettant NULL dans l'insert ca marche \o/

    Merci beaucoup.

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je suis ravi de t'avoir dépanné.

    Mais si tu as des contraintes de clés étrangères dans ta base, tu devrais terminer mon tuto: tel que construite, ta base a des requêtes de construction de tables dans l'ordre alphabétique de leurs noms. Lors d'une future exécution requête par requête (pour debugging), ça risque de générer des erreurs, parce que les instructions de contraintes vont citer des tables qui ne sont pas encore construites à ce moment. La 2ème partie de mon tuto dit ce qu'il faut faire pour retrouver une base identique à la base initiale, à part les corrections volontaires.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JVM][OPTIONS][OPTIMISATION]pc dédié à Java
    Par narmataru dans le forum Général Java
    Réponses: 7
    Dernier message: 16/04/2003, 17h12
  2. [Kylix] kylix3 : pb sur options de projet
    Par Arsene dans le forum EDI
    Réponses: 3
    Dernier message: 09/04/2003, 10h41
  3. [propriétés]Option Checked
    Par psl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/08/2002, 08h07
  4. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 15h33
  5. Vous gerez comment les options d'un programme?
    Par n0n0 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2002, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo