8
votes

Stockage d'un jeu de python dans une base de données avec Django

J'ai besoin de stocker un Python défini dans une base de données pour accéder ultérieurement. Quelle est la meilleure façon de faire ça? Mon plan initial était d'utiliser un champ de texte sur mon modèle et de stocker simplement l'ensemble comme une chaîne de virgule ou de pipes délimitée, puis lorsque j'ai besoin de le retirer pour une utilisation dans mon application, je pourrais initialiser un ensemble en appelant Split sur la chaîne. Évidemment, s'il existe un moyen simple de sérialiser l'ensemble pour la stocker dans la DB afin que je puisse le retirer comme un ensemble lorsque je dois l'utiliser plus tard, ce serait le meilleur.


2 commentaires

Comme votre question. J'aimerais voir ce que les experts pythonistas ont à dire.


Y a-t-il une raison spécifique que vous essayez de persister un jeu de python? Pourquoi ne pas avoir de relation de clé étrangère dans la base de données avec les contraintes correctes pour rendre les articles uniques?


4 Réponses :


4
votes

Si votre base de données est meilleure pour stocker des blobs de données binaires, vous pouvez Pickle votre ensemble. En fait, le cornichon stocke des données comme texte par défaut, il peut donc être meilleur que l'approche de chaîne délimitée de toute façon. Juste pickle.dumps (your_set) et pickled = pickle.loads (base de données_string) ultérieurement.


1 commentaires

pickle.dumps () et pickle.loads () fonctionne sur les chaînes (c'est ce que "S" est pour), celles-ci peuvent donc aller dans varchar ou d'autres colonnes de texte aussi



0
votes

Quoi de CommaseparatedIntegerfield ?

Si vous avez besoin d'un autre type (chaîne par exemple), vous pouvez créer votre propre champ qui fonctionnerait comme commaseparatedergerfield mais utilisera des chaînes (sans virgules).

ou, si vous avez besoin d'un autre type, probablement une meilleure façon de le faire: Donner un dictionnaire qui mesure des entiers à vos valeurs.


0 commentaires

2
votes

Il existe un certain nombre d'options ici, en fonction du type de données que vous souhaitez stocker dans l'ensemble.

Si c'est des entiers réguliers, CommaseparatedIntegerfield pourrait fonctionner bien , bien que cela ressemble souvent à une méthode de stockage maladroite pour moi.

S'il s'agit d'autres types d'objets Python, vous pouvez essayer Pickling avant de l'enregistrer à la base de données, et le désactivez lorsque vous le chargez à nouveau. Cela semble être une bonne approche.

Si vous voulez quelque chose de lisible humain dans votre base de données, vous pouvez même JSON-Encode IT dans un champ de texte, tant que les données que vous rangez n'incluent pas les objets Python.


1 commentaires

Je pense que CommaseparateDintegerfield est parfait lorsque les valeurs de multipléchoicefield doivent être enregistrées dans la base de données.



1
votes

Redis stocke nativement les ensembles (ainsi que d'autres structures de données (listes, dictes, file d'attente)) et fournit des opérations définies - et sa fusée rapide aussi. Je trouve que c'est le couteau suisse de l'armée pour le développement de Python.

Je sais que ce n'est pas une base de données relationnelle en soi, mais cela résout ce problème très concis.


0 commentaires