48 votes

Utiliser uniquement la partie DB de Django

Est-ce que quelqu'un sait à quel point Django est "modulaire"? Puis-je utiliser uniquement la partie ORM pour obtenir des classes mappées sur des tables de base de données et savoir lire / écrire à partir de ces tables?

Si non, que recommanderiez-vous comme "l'équivalent Python d'Hibernate"?

91voto

James Bennett Points 6318

Si vous aimez l'ORM de Django, c'est très simple à utiliser "autonome"; j'ai écrit plusieurs techniques pour utiliser des parties de Django en dehors d'un contexte web, et vous êtes libre de les utiliser (ou rouler).

Shane ci-dessus semble être un peu mal informés sur ce sujet et sur quelques autres points, par exemple, Django peut faire de multiples bases de données différentes, il n'a tout simplement pas de valeur par défaut pour que (vous avez besoin de faire un custom manager sur les modèles qui utilisent autre chose que la "principale" de DB, quelque chose qui n'est pas trop dur et il y a des recettes flottant autour pour cela). C'est vrai que Django lui-même ne fait pas de la gestion de la connexion/le regroupement de connexion, mais personnellement j'ai toujours utilisé des outils externes pour que de toute façon (par exemple, pgpool, ce qui les roches plus difficile que tout ce qui est bâti dans un ORM pourrait jamais).

Je te suggère de passer un certain temps à lire et peut-être essayer quelques recherches sur Google (par exemple, le post, je vous lié au sort comme le plus haut résultat pour "stand-alone Django script") pour avoir une idée de ce que sera fait le mieux en fonction de vos besoins et de vos goûts -- il peut être ORM de Django n'est pas bon pour vous, et vous ne devriez pas l'utiliser si elle n'est pas, mais malheureusement il y a beaucoup de désinformation là-bas qui brouille les eaux.

L'édition de répondre à Shane:

Encore une fois, vous semblez mal informé: SQLAlchemy doit être configuré (c'est à dire, dit ce DB à utiliser, la façon de se connecter, etc.) avant de pouvoir exécuter des requêtes avec elle, alors, comment est le fait que Django besoins de configuration similaire (réalisés par l'intermédiaire de votre choix de méthodes -- vous n'avez pas besoin d'avoir plein de Django fichier de paramètres) un désavantage?

Comme pour plusieurs DB soutien, vous semblez confondre: le soutien est là, à un faible niveau. L'objet de requête -- non QuerySet, mais le sous-jacent Query objet qu'il va exécuter sait ce qu'DB il est connecté à, et accepte une connexion DB comme l'un de ses arguments d'initialisation. Raconter un modèle à utiliser une DB et un autre modèle à utiliser un autre est aussi simple que la mise en place d'une méthode sur un manager qui passe à droite des infos de connexion vers le bas dans l' Query. Vrai, il n'y a pas de plus haut niveau de l'API pour cela, mais ce n'est pas le même que l'indication "no support" et pas la même chose que l'exige le code personnalisé" (sauf si vous dirais que la configuration de plusieurs DBs explicitement dans SQLAlchemy, nécessaire si vous souhaitez que plusieurs DBs, est aussi un "code personnalisé").

Quant à savoir si vous vous retrouvez indirectement en utilisant des choses qui ne sont pas en django.db, eh bien, alors? Le fait qu' django.db des importations de bits de, disons, django.utils parce qu'il y a des structures de données et autres bouts de code qui sont utiles pour plus que juste un ORM est bien comme je suis personnellement concerné; on pourrait tout aussi bien se plaindre si quelque chose a des dépendances externes ou du fait de l'utilisation de bibliothèques Python au lieu d'être 100% autonome.

15voto

Shane Breatnach Points 528

La réponse courte est: non, vous ne pouvez pas utiliser l'ORM de Django séparément de Django.

La réponse est: oui, vous pouvez, si vous êtes disposé à charger de grandes parties de Django avec elle. Par exemple, la connexion de base de données qui est utilisé par Django est ouverte lorsqu'une demande de Django se produit. Cela se produit lorsqu'un signal est envoyé afin que vous peut manifestement envoyer ce signal pour ouvrir la connexion sans l'aide de la spécificité de la demande mécanisme. Aussi, vous aurez besoin pour l'installation de diverses applications et les paramètres pour le projet Django.

En fin de compte, il n'est sans doute pas utile de votre temps. SQL Alchimie est relativement bien connue Python ORM, qui est en fait plus puissant que de Django reinhardt, de toute façon, car il prend en charge plusieurs connexions de base de données de connexion et de mise en commun et d'autres bonnes choses.


Edit: en réponse à James critiques ailleurs, je vais préciser ce que j'ai décrit dans mon premier post. Alors qu'il est réjouissant de constater que l'un des principaux Django contributeur m'a appelé, je pense toujours que je suis de droite :)

Tout d'abord, pensez à ce qui doit être fait pour utiliser l'ORM de Django distincte de toute autre partie. Vous utilisez l'une des méthodes décrites par James pour faire une installation de base de Django. Mais un certain nombre de ces méthodes ne permettent pas à l'aide de l' syncdb de commande, ce qui est nécessaire pour créer les tables pour vos modèles. Un settings.py fichier est nécessaire pour cela, avec des variables non seulement pour DATABASE_*, mais aussi INSTALLED_APPLICATIONS avec les bons chemins à tous models.py les fichiers.

Il est possible de faire votre propre solution pour utiliser syncdb sans settings.py mais il nécessite des connaissances approfondies de Django. Bien sûr, vous n'avez pas besoin d'utiliser syncdb; les tableaux peuvent être créés de façon indépendante des modèles. Mais il est un aspect de l'ORM qui n'est disponible que si vous mettez un peu d'effort dans le programme d'installation.

Deuxièmement, examiner comment vous pouvez créer vos requêtes à la base de données avec la norme Model.objects.filter() appel. Si cela est fait dans le cadre d'un point de vue, c'est très simple: construire l' QuerySet et de visualiser les instances. Par exemple:

tag_query = Tag.objects.filter( name='stackoverflow' )
if( tag_query.count() > 0 ):
    tag = tag_query[0]
    tag.name = 'stackoverflowed'
    tag.save()

Sympa, simple et propre. Maintenant, sans la béquille de Django demande/réponse de système de chaînage, vous devez initialiser la connexion de base de données, faire la requête, puis fermer la connexion. Ainsi l'exemple ci-dessus devient:

from django.db import reset_queries, close_connection, _rollback_on_exception
reset_queries()
try:
    tag_query = Tag.objects.filter( name='stackoverflow' )
    if( tag_query.count() > 0 ):
        tag = tag_query[0]
        tag.name = 'stackoverflowed'
        tag.save()
except:
    _rollback_on_exception()
finally:
    close_connection()

La connexion de base de données de gestion peut également être fait via Django signaux. Tous les ci-dessus est défini dans django/db/init.py. D'autres Orm ont aussi ce genre de gestion de la connexion, mais vous n'avez pas besoin de creuser dans leur source pour savoir comment le faire. SQL Alchimie de la connexion du système de gestion documenté dans les tutoriels et d'ailleurs.

Enfin, vous devez garder à l'esprit que la base de données objet de connexion locale pour le thread courant en tout temps, ce qui peut ou peut ne pas vous limiter en fonction de vos besoins. Si votre application n'est pas apatride, comme Django, mais persistant, vous pouvez frapper problèmes de threading.

En conclusion, c'est une question d'opinion. À mon avis, à la fois les limitations de, et l'installation nécessaire pour, ORM de Django reinhardt, distinct du cadre est trop de responsabilité. Il y a parfaitement viable dédié ORM solutions disponibles ailleurs qui sont conçus pour l'utilisation de la bibliothèque. Django n'est pas.

Ne pense pas que tous les ci-dessus montre que je n'aime pas Django et de tous les rouages, j'aime vraiment Django beaucoup! Mais je suis réaliste sur les capacités et un ORM bibliothèque n'est pas l'un d'eux.

P. S. Multiples de connexion à la base de soutien est en train d'être travaillé sur. Mais il n'est pas là maintenant.

10voto

KeyboardInterrupt Points 759

(Je ne fais que le signaler ma solution parce que ma question a dit être un doublon)

Ah ok j'ai compris et afficherons les solutions pour n'importe qui qui essaye de faire la même chose.

Cette solution suppose que vous voulez créer de nouveaux modèles.

D'abord créer un nouveau dossier pour stocker vos fichiers. Nous allons l'appeler "autonome". Dans "autonome", créer les fichiers suivants:

__init__.py
myScript.py
settings.py

De toute évidence, "myScript.py" peut être nommé que ce soit.

Ensuite, créez un répertoire pour vos modèles.

Nous allons nommer notre modèle répertoire "myApp", mais se rendent compte que cela est une application Django au sein d'un projet, en tant que tel, nom approprié pour la collection de modèles que vous écrivez.

Dans ce répertoire, créer 2 fichiers:

__init__.py
models.py

Vous allez avoir besoin d'une copie de manage.py à partir d'un un projet Django, ou vous pouvez simplement prendre une copie de votre Django chemin d'installation:

django\conf\project_template\manage.py

Copie de la manage.py pour votre /autonome répertoire. Ok, donc vous devriez maintenant avoir la structure suivante:

\standAlone
    __init__.py
    myScript.py
    manage.py
    settings.py
\myApp
    __init__.py
    models.py

Ajoutez les lignes suivantes à votre myScript.py fichier:

# settings.py
from django.conf import settings

settings.configure(
    DATABASE_ENGINE    = "postgresql_psycopg2",
    DATABASE_NAME      = "myDatabase",
    DATABASE_USER      = "myUsername",
    DATABASE_PASSWORD  = "myPassword",
    DATABASE_HOST      = "localhost",
    DATABASE_PORT      = "5432",
    INSTALLED_APPS     = ("myApp")
)

from django.db import models
from myApp.models import *

et l'ajouter à votre settings.py fichier:

    DATABASE_ENGINE    = "postgresql_psycopg2"
    DATABASE_NAME      = "myDatabase"
    DATABASE_USER      = "myUsername"
    DATABASE_PASSWORD  = "myPassword"
    DATABASE_HOST      = "localhost"
    DATABASE_PORT      = "5432",
    INSTALLED_APPS     = ("myApp")

et enfin votre myApp/models.py:

# myApp/models.py
from django.db import models

class MyModel(models.Model):
     field = models.CharField(max_length=255)

et c'est tout. Maintenant pour avoir Django gérer votre base de données, dans l'invite de commande, accédez à notre programme /répertoire et exécutez:

manage.py sql MyApp

9voto

Andy Hume Points 15186

Vous pouvez certainement utiliser différentes parties de Django de manière autonome. Après tout, il s’agit simplement d’une collection de modules Python, que vous pouvez importer dans n’importe quel autre code que vous souhaitez utiliser.

Je vous recommanderais également de regarder SQL Alchemy si vous êtes seulement après le côté ORM.

4voto

dwc Points 12676

Je recommande SQLAlchemy . Il devrait faire tous les trucs ORM, ainsi que des trucs SQL de base.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X