2016-06-12 4 views
1

私は長年にわたってDjangoをかなり楽しんできました。今私は、私たちのデータベースから情報にアクセスするための共有内部ライブラリを構築している会社のために働いています。現在、物事はひどく荒々しい - 多くのインラインSQLコード。いくつかの同僚はコードにアクセスする作業をしていましたが、これは私がDjangoが慣れているようなものです。 Djangoは基本的にモジュラー型であると聞いていたので、ORMシステムを単独で使うこともできました。私はSqlAlchemyのような他のパッケージがあることを知っていますが、Djangoは平均的なケースではもっと簡単に処理すると聞いています。私もDjangoを知っていて、SQLAlchemyを知らない。PythonライブラリでDjango ORMを使用するとトラブルが発生しますか?

したがって、次のような概念の証明ができます。ここでは、ディレクトリ構造は次のとおりです。

+-- example.py 
+-- transfer 
| +-- __init__.py 
| +-- models.py 

ここmodels.py

import django.conf 
import django.db.models 

django.conf.settings.configure(
    DATABASES = ..., # database info 
    INSTALLED_APPS = ("transfer",), 
    SECRET_KEY = 'not telling', 
) 
django.setup() 

class TransferItem(django.db.models.Model) 
    # model info here 

example.py

from transfer.models import TransferItem 
items = TransferItem.objects.all() 
print items 

があるこれは、限り、それが行くように、正常に動作するようです。しかし、私はライブラリのコンテキストでブートストラップコードが心配です。具体的には:

  1. これはアプリとして考えるのは危険ですか?この場合、「転送」はルートモジュールですが、ライブラリのコンテキストでは、これは深く埋めることができます。たとえば、「mycompany.data.protocols.transfer」と入力します。理論的には、これらのデータモデルをコードベース全体で定義することができます。この「アプリリスト」はどのようにスケールできますか?
  2. セットアップへの呼び出しは本当に私を心配します。 djangoのドキュメントでは、セットアップを一度だけ呼び出すとしか言いません。それでも、ライブラリの本質は、どのようなPythonアプリケーションでも、どんなタイプのデータモデルでもインポートできるということです。どのような種類のモデルを使用してもデータが返され、そのときだけ、Pythonアプリケーションがインポートする必要があると判断するでしょうか?別のタイプのモデル(おそらく別の「アプリ」に)?

だから、基本的な質問はこれです:

はPythonライブラリでDjangoのORMを使用するには良い方法はありますか?

EDIT:これはない CLIツールの質問の重複しています。私はWebサーバーの外でdjangoを実行する方法を知っています。私はこれを示すコードサンプルを与えた。私は、モデルファイルをクライアントコードでインポートして任意の順序で使用することができる "アプリケーション"自体がない場所でdjangoを実行する方法があるかどうかを知りたいと思います。

+0

依存する、あなたのpythonライブラリは何ですか? –

+0

私はVFX社の仕事をしています。さまざまな社内データベース、人事関連、ショー関連などを扱っています。さまざまなpythonアプリケーションは、これらから読んだり更新したりする必要があります。私たちは、共有されたPythonライブラリに、このコードを取り込むのではなく、この通信をカプセル化するための素敵なPythonオブジェクトを用意しておきます。 DjangoはORMで私たちのほとんどを得ているようです。セットアップの呼び出しやINSTALLED_APPSの呼び出しでない場合は、私たちが望むものを正確に言うでしょう。 – thegiffman

+0

[CLIツールにdjangoを使用する]の可能な複製(http://stackoverflow.com/questions/32088702/using-django-for-cli-tool) – e4c5

答えて

0

OK、いくつかの調査の後に質問に答えるための私自身の試みです。

次のように私はどこにでも図書館で私のモデルのための基底クラスを作成することができます。

from django.db import models 
from django.apps import apps 
import django.conf 

django.conf_settings.configure(
    DATABASES = ... 
) 

apps.populate((__name__,)) 

class LibModel(models.Model): 
    class Meta: 
     abstract = True 
     app_label = __name__ 

次にどこでも図書館に私はこの基底クラスで自分のモデルを作成することができます。私はデータベース名の "app"に頼っていないので、明示的に述べる必要があります。

class SpecificModel(LibModel): 
    # fields go here 
    class Meta(LibModel.Meta): 
     db_table = "specific_model_table_name" 

これは、「アプリ」の構造をシミュレートすることの私の懸念の周りになります。ベースクラスのの名前は、Djangoに必要なものをすべて提供します。その後、Djangoはアプリを見つけられなかったことについて泣いてしまいます。他のモデルファイルは、どこでも好きな場所に置くことができます。

しかし、まだ致命的かもしれない大きな懸念があります。 Djangoの初期化自体は、本質的にはまだシングルトンです。私のライブラリがDjangoアプリケーションによってインポートされた場合、それはすべてクラッシュして焼いてしまうでしょう。私はthis follow up questionでこれに対する解決策を求めました。

関連する問題