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

Python Discussion :

[Debutant] Python-SQLite lire colonne BLOB


Sujet :

Python

  1. #21
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Par défaut
    Salut Tyrtamos,

    Désolé, je croyais que tu avais trouvé.
    Non j ai pas trouvé. En fait me suis fait embarquer sur un autre projet pour quelques jours ... En tout cas, tu n as pas dutout a t excuser et merci bcp pour ton aide.

    Consernant la situation, j ai en ma possession le code python du programme qui utilise cette base de donnee que je voudrais manipuler ... J essaye de voir avec mes partenaires sur le projet, si je peux le partager et si oui je le posterai ici (en therorie il est open source). Je suis sur que pour quelqu un qui connait bien python ca doit etre facile de voir comment il lis les blobs, mais j y ai passé pas mal d heures sans succés. (Faut dire que je connais pas des masses python, j utilise plutot Fortran et VB.net ...)

    Ce que je peux dire pour l instant c qu a un endroit il y a :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from sqlalchemy import *
    from migrate import *
     
    metadata = MetaData()
     
    nodeattribute_table = Table('nodeattributes', metadata, 
            Column('node_id', Integer, ForeignKey('nodes.id'), primary_key=True),
            Column('attribute_id', Integer, ForeignKey('nodetypefields.id'), \
                   primary_key=True),
            Column('value', PickleType)
    )
    Est ce que le fait qu il y ai PickleType repond a ta question ?

    Merci

    Slumpy

  2. #22
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Oui, ça éclaire un peu plus, et même beaucoup. Cela veut dire qu'il faut chercher du côté de SQLAlchemy, et pas des modules scientifiques.

    Mais je ne connais pas plus SQLAlchemy que toi...

    Par contre, La notice de SQLAlchemy dit que le type PickleType correspond bien à un stockage avec le module pickle.

    Donc, avec le blob précédent de 179 octets (node_id=676 and attribute_id=52), je demande son décodage par pickle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    v = pickle.loads(str(blob)) 
    print v
    Ce qui m'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [[     0.  10000.      0.      0.     50.      0.]
     [    10.  10000.   1000.      0.     50.      0.]]
    Et là, ça commence à vouloir dire quelque chose!

    Mais c'est une donnée de type 'numpy.ndarray', et je ne sais pas la manipuler. J'espère que tu sauras.

    En tout cas, tu peux maintenant récupérer toutes tes données!

    Tyrtamos

  3. #23
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Par défaut
    Salut,

    Cooolll, enfin je commence a croire que je vais arriver a quelque chose avec ca Je commencais a desesperer ...

    Merci bcp tyrtamos, c vraiment cool.

    Alors voila, j ai fait le petit test suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import sqlite3
    #import sqlalchemy
    import pickle
     
    cnx = sqlite3.connect("O:/080 - Models/Models/IRAS/Network/Zone II/Standardised networks/Sample_blob.db")
    cur = cnx.cursor()
    cur.execute("""SELECT value FROM nodeattributes WHERE node_id=676 and attribute_id=52;""")
    blob = cur.fetchone()[0]
    print type(blob), len(blob)
    v= pickle.loads(str(blob))
    print v
    print
    print
    print v[1][1]
    v[1][1]=50
    print
    print
    print v
    new_blob=pickle.dumps(v)
     
    cur.execute("update nodeattributes set value=? WHERE node_id=676 and attribute_id=52",[new_blob])
    cnx.commit()
    cur.close()
    cnx.close()
    voila ce que j obtiens :
    [[ 0. 10000. 0. 0. 50. 0.]
    [ 10. 10000. 1000. 0. 50. 0.]]


    10000.0


    [[ 0. 10000. 0. 0. 50. 0.]
    [ 10. 50. 1000. 0. 50. 0.]]
    Donc en clair:
    - je lis le tableau contenu dans le blob grace a ton code
    - j affiche n importe quel element du tableau (ici deuxieme ligne, 2ieme colonne)
    - je modifie la cellule de mon tableau
    - je cree un autre blob (avec pickle.dumps)
    - et mets a jour mon blob dans la base de donnees.

    (J ai aussi refais tourner le code pour voir qu il avait bien mis a jour la valeur dans la base de donnee).

    En fait, ce que je ne comprends po trop maintenant, c est quand fait on utilise meme po sqlalchemy ?

    Slumpy

  4. #24
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    D'après ce que je comprends, SQLAlchemy est une "machinerie" de gestion de données orientée objet. Et apparemment, il se sert de sqlite3 pour stocker les données. Et nous, on ne s'est intéressé qu'au blob que SQLAchemy a stocké avec pickle.

    Rien de t'empêche de creuser un peu SQLAlchemy pour t'en servir, on en dit le plus grand bien. Par contre, on ne peut pas dire que sa présentation bénéficie d'une grande clarté (http://fr.wikipedia.org/wiki/SQLAlchemy). En ce qui me concerne, je préfère pour l'instant 'causer' directement avec SQLite3.

    Tyrtamos

  5. #25
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 715
    Par défaut
    Salut,
    Quelque part, il y a une application qui a été construite "au dessus" de SQLAlchemy. C'est un ORM: le programmeur Python "voit" les informations stockées en BDD à travers les objets construit "au dessus" de SQLAlchemy.
    SQLAlchemy fait tout son possible pour effectuer ses opérations de stockage et de mapping de façon indépendante du SGDB utilisée.
    On peut remplacer SQLite par PostGreSQL, MySQL, ... et "à la limite", la seule chose à modifier c'est le "dialect" qui compose l'URL passé pour se connecter au SGDB.

    Le SGDB étant indépendant de SQLAlchemy - qui n'est qu'une sorte d'API -, on peut bien sûr accéder aux données "directement" via des requêtes SQL. Et plutôt que de dépendre de l'API construire "au dessus" de SQLAlchemy, on dépendra directement du schéma des tables.
    Et suivant les évolutions de ce schéma, il y aura à priori plus de boulot à réaliser pour mettre à jour le code qui 'tape' plus bas.

    Exemple Le PickleType dans SQLAlchemy est définit comme:
    PickleType builds upon the Binary type to apply Python’s pickle.dumps() to incoming objects, and pickle.loads() on the way out, allowing any pickleable Python object to be stored as a serialized binary field.
    Autrement dit, si vous aviez quelque peu pris la peine de comprendre comment est construite l'application existante, vous auriez gagné beaucoup de temps: la conversion pickle aurait été transparente... Rien à faire, même pas à se poser de questions sur la nature du contenu de la colonne.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #26
    Membre éclairé
    Inscrit en
    Mars 2006
    Messages
    342
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 342
    Par défaut
    Salut,

    Merci d'avoir pris la peine de repondre.

    si vous aviez quelque peu pris la peine de comprendre comment est construite l'application existante, vous auriez gagné beaucoup de temps
    Bah malheureusement j y ai passé un certain temps sans succée (environ une dizaine d'heures) ... Donc certes, je suis tres mauvais en python mais j ai pris la peine de chercher avant de poster ... (Meme si je comprends que tu puisses avoir eu l impression inverse ! )

    Concernant SQLAlchemy, ce que je ne comprends po c'est que si j effectue une recherche du mot cle SQLAlchemy, celui ci n apparait que dans la declaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from sqlalchemy import *
    et jamais autre part (avec sqlalchemy.quelquechose) ... Donc je m etais dit qu il ne l utilisait pas ...

    Slumpy

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. SQLite lire colonne complète
    Par ncurses dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 16/07/2013, 11h19
  2. inserer un pdf dans une colonne BLOB
    Par yac dans le forum Oracle
    Réponses: 2
    Dernier message: 10/03/2006, 15h49
  3. changer le tablespace d'une colonne blob
    Par learn dans le forum Oracle
    Réponses: 4
    Dernier message: 15/08/2005, 18h44
  4. debuter en SQLite
    Par venomelektro dans le forum SQLite
    Réponses: 4
    Dernier message: 08/12/2004, 19h17
  5. INTERBASE 5.5 insertion dans une colonne BLOB
    Par mariustrezor dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/10/2004, 18h06

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