Est-il possible de stocker Python les objets de la classe dans SQLite?
Je voudrais stocker des objets Python dans un SQLite base de données. Est-ce possible?
Si oui, quels seraient certains des liens /des exemples pour elle?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas stocker l'objet lui-même dans la DB. Ce que vous faites est de stocker les données de l'objet et de le reconstruire plus tard.
Une bonne façon est d'utiliser l'excellent SQLAlchemy de la bibliothèque. Il vous permet de mapper votre classe définie à une table dans la base de données. Chaque mappé attribut seront stockées et peuvent être utilisées pour reconstruire l'objet. L'interrogation de la base de données renvoie les instances de votre classe.
Avec elle, vous pouvez utiliser non seulement sqlite, mais la plupart des bases de données - actuellement, Il prend également en charge Postgres, MySQL, Oracle, MS-SQL, Firebird, MaxDB, MS Access, Sybase, Informix et DB2 d'IBM. Et vous pouvez avoir votre utilisateur de choisir qui elle veut l'utiliser, parce que vous pouvez basculer entre ces bases de données sans modifier le code.
Il y a aussi un grand nombre de fonctionnalités intéressantes comme automatique
JOIN
s, polymorphing...Un moyen rapide, simple exemple, vous pouvez exécuter:
Alors je peux l'utiliser comme ceci:
Qui irait à l'
INSERT
déclarations à l'encontre de la base de données.Que la requête souhaitez exécuter
SELECT users.id AS users_id, users.name AS users_name, users.address AS users_address, users.password AS users_password
.Le résultat imprimé serait:
De sorte que vous êtes effectivement le stockage de votre objet dans la base de données, la meilleure façon.
pickle
est pas en vaut la peine. Il semble cool et tout, mais vous vous ne pouvez pas filtre/participer/agreggate de données, puisque l'objet est stocké comme un goutte, défaisant le but de l'utilisation d'une base de données en premier lieu.Oui c'est possible, mais il existe des approches différentes et dont l'un est le convient, tout dépendra de vos besoins.
Décapage
Vous pouvez utiliser le cornichon module de sérialiser des objets, ensuite stocker ces objets dans un blob dans sqlite3 (ou un champ de texte, si l'image est par exemple codé en base64). Être conscient de certains problèmes possibles: questions/198692/can-i-cornichon-un-python-dictionnaire-dans-un-sqlite3-le champ texte
Object-Relational Mapping
Vous pouvez utiliser le mapping objet-relationnel. Cela crée, en effet, un "objet virtuel" base de données qui peut être utilisé dans le langage de programmation (Wikipédia). Pour python, il y a une belle trousse à outils pour cela: sqlalchemy.
Vous pouvez utiliser cornichon.dumps, son retour cliquable objets comme des chaînes de caractères, vous n'auriez pas besoin de l'écrire dans les fichiers temporaires.
Vous d'autres choix au lieu de décapage consiste à utiliser un ORM. Cela vous permet de mapper des lignes dans une base de données d'un objet. Voir http://wiki.python.org/moin/HigherLevelDatabaseProgramming pour un point de départ. Je le recommande SQLAlchemy ou SQLObject.
Vous pouvez utiliser cornichon pour sérialiser l'objet. L'objet sérialisé peut être inséré à la DB sqlite comme un objet bytearray champ.
Maintenant lire
object.dump
à partir du fichier, et de l'écrire à la DB sqlite. Vous pourriez écrire comme un type de données binaire; lisez à propos de stocker des données binaires et d'objets blob dans SQLite ici. Note que, selon cette source, SQLite limite la taille de ces datafield à 1 mo.Je pense que la meilleure option serait la sérialisation de votre objet dans un fichier, et de conserver le fichier nom, pas le contenu, dans la base de données.
En fonction de vos besoins, il pourrait être intéressant de regarder dans Django (www.djangoproject.com) pour cette tâche. Django est en fait un framework web, mais l'une des tâches qu'il gère est de vous permettre de définir des Modèles comme des objets python (héritant d'une classe de base fournies par le framework). Il va alors créer automatiquement les tables de base de données pour stocker ces objets, et sqlite est parmi les backends supportés. Il fournit également des fonctions pratiques pour interroger la base de données et de retourner un ou plusieurs objets correspondants. Voir, par exemple, la documentation sur les Modèles django:
http://docs.djangoproject.com/en/1.9/topics/db/models/
L'inconvénient est bien sûr que vous devez installer complète framework web, et (comme je me souviens bien), vous ne pouvez stocker des objets dont les attributs sont pris en charge par django. Aussi, il est fait pour stocker de nombreuses instances d'objets prédéfinis, pas pour le stockage d'une instance de chacun des nombreux objets différents. En fonction de vos besoins, cela peut ou peut ne pas être pratique.
Une option est d'utiliser un O/R mapper comme SQLObject. plus de la plomberie pour conserver l'objet Python à une base de données, et il prend en charge SQLite. Comme mentionné ailleurs, vous pouvez également serialise l'objet à l'aide d'une méthode telle que pickle, qui déverse une représentation de l'objet qu'il est possible de le reconstituer par la lecture et l'analyse.
Il est relativement simple de la façon de stocker et de comparer des objets, eaven pour indexer ces objets et à les limiter (avec ubique) les colonnes contenant des objets. Et tout cela sans l'aide de l'ORM moteurs. Objets mât être stocké à l'aide de pickle dump (donc la performance pourrait être un problème) Voici l'exemple pour le stockage de python tuples, l'indexation de la restriction et le comparant. Cette méthode peut être facilement appliquée à tout autre python classe. Tout ce qui est nécessaire est expliqué en python sqlite3 documentation (quelqu'un a déjà posté le lien). De toute façon ici c'est tous mis ensemble dans l'exemple suivant: