27

私は、類似した (しかし同一ではない) データベースの品揃えを持っており、アクセスを「標準化」する方法として SQLAlchemy を使用したいと考えています。データベースは、列名に一意のプレフィックスが付いているなど、わずかに異なる場合もあれば、より劇的に異なり、列が欠落している (または古いデータベースの場合はテーブル全体が欠落している) 場合もあります。

私が助けを求めているのは、SQLAlchemy の問題ではなく、Python/組織の問題です。プロジェクトで簡単に再利用できる複数のデータベースをセットアップするにはどうすればよいですか?

SQLAlchemy セッションについて読んだことがありますが、プロジェクトごとにそれぞれをインスタンス化せずにそれらを使用する方法がわかりません。

私の質問は次のとおりです: SQLAlchemy で使用される多くのデータベース モデルのセットアップを含むモジュール/パッケージを作成し、別の python プロジェクトで簡単にインポート/使用できるようにするにはどうすればよいですか?

不足している列/テーブルの処理については、まだそれほど心配していません。その問題は後で取り組むことができますが、データベースごとにまったく同じモデルを使用することはできないため、覚えておく必要があります。

このトピックに関するリソース、ポインター、または読み物は本当にありがたいです。事前に感謝します。これが他の場所で回答されている場合は申し訳ありませんが、検索ではこれに関連するものは何も表示されませんでした.

編集: オリジナルはそのまま残しており、ポールのアドバイスに基づいてコンテンツを追加しています。

RE: SA ORM - はい、SQLAlchemy ORM を使用する予定です。明らかな理由から、実際のデータベースを提供することはできません。ただし、DB1、DB2、および DB3 という適切な名前が付けられたこれら 3 つの架空のデータベースを想定してください (それぞれに 1 つのテーブルがあり、数列しかないため、実際には両方ともかなり多く存在すると想定します)。

各データベースには、それぞれにいくつかの列を持つユーザー テーブルがあります。以下は、テーブル/列の SQL 表記です。

DB1.user  --> DB1.user.id,      DB1.user.username,  DB1.user.email
DB2.user  --> DB2.user.id,      DB2.user.user_name, DB2.user.email
DB3._user --> DB3._user.userid, DB3._user.username, DB3.user.email_address

現在、これらのデータベースを「モジュラー」に分離し、データベースを追加できるようにしようとしています。

以下を含む、いくつかの異なるファイル編成の側面を検討しました(必要に応じて __init__.py が存在すると仮定しますが、簡潔にするために省略されています)。

Databases         |    Databases            |    Databases
    DB1.py        |        DB1              |        DB1
    DB2.py        |            models.py    |            models
    DB3.py        |        DB2              |                user.py
                  |            models.py    |                anothertable.py
                  |        DB2              |        ...
                  |            models.py    |        DB3
                  |                         |            models
                  |                         |                user.py
                  |                         |                anothertable.py

SA ORM を使用してこれらにアクセスできるようにしたいと考えています。Python ファイルでこれらのデータベースを使用するときは、できるだけ少ないインポート/宣言でアクセスできるようにしたいと考えています。次のようなことをする必要があります:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from Database import DB1, ..., DB[N]
db1_engine = create_engine('connect_string/db1')
db1_session = sessionmaker(bind=db1_engine)()
...
db3_engine = create_engine('connect_string/db3')
db3_session = sessionmaker(bind=db3_engine)()

3 つ以上のデータベースを扱うことになるので、非常に面倒です。私はむしろそれが私のためにすでに世話をされていることを望んでいます(おそらく__init__.pyファイルで?)

次のようにアクセスして使用できます。

import Databases

Databases.DB1.session.query('blahblah')

無限に良くなるでしょう。

EDIT2:モデルをセットアップするときに、データベース/列の命名規則のバリアントを回避する方法も知っています。それは問題ではありませんが、複数のデータベースに対して 1 つのモデル セットを使用することはできないことがわかったので、言及しました。

I hope by expanding this I didn't muddy the waters or make this too confusing. Thanks for taking the time to read it!

EDIT3: I've managed to spend a little more time on this. I've set up the project in the following way:

Databases
    __init__.py
    databases.py
    settings.py
    DB1
        __init__.py
        models.py
    ...
    DB3
        __init__.py
        models.py

At present, I have a tupple of databases that are 'installed' in the settings.py file. Each entry is would like like INSTALLED_DATABASES = ('DB1', ..., 'DB3'). As I complete more models, and they get added to the list of tupples. This allows me to add or remove content as I go.

I have the engine and sessios setup inside the models.py file, and have the init.py file for each database setup to from models import *.

In the databases.py file I have the following

class Databases(object):
    def __init__(self):
        for database in INSTALLED_DATABASES:
            setattr(self, database, __import__(database))

I can now use these via:

from databases import Databases

db = Databases()

for qr in db.DB1.query(db.DB1.User):
    print qr.userid, qr.username

SQLAlchemy を使用すると、モデルを定義するときに列名を手動で指定できます。これは、私が望んでいた標準化にとって大きなメリットです。

私にはまだ多くの仕事が待っています。モデルの検証を強制するオブジェクト (つまり、フィールドが存在するかどうか、存在しないフィールドにデフォルト値があるかどうかなど) を作成し、これが私の IDE でどのように機能するかをよりよく組み込みたいと考えています (現時点ではそうではありません) )。しかし、私は正しい軌道に乗っています。私と同じことをする方法をたまたま疑問に思っている人のために、これを更新すると思いました。

長くなってすみません!

乾杯!

4

2 に答える 2

7

最初の質問に対する要求に従って、3 回目の編集を行い、それを回答にしました。適切なプロトコルがわからないため、上記の 3 番目の編集を残しました。すでに EDIT3 を読んでいる場合は、私が答えとして持っているものを読んでいます。

私はこれにもう少し時間を費やすことができました。次の方法でプロジェクトを設定しました。

Databases
    __init__.py
    databases.py
    settings.py
    DB1
        __init__.py
        models.py
    ...
    DB3
        __init__.py
        models.py

現在、settings.py ファイルに「インストール」されているデータベースのタプルがあります。各 DB エントリは に指定されていINSTALLED_DATABASES = ('DB1', ..., 'DB3')ます。より多くのモデルを完成させると、それらはタプルのリストに追加されます。これにより、コンテンツを随時追加または削除できます。

models.pyファイル内にエンジンとセッションをセットアップし__init.py__、各データベースのファイルをfrom models import *.

database.py ファイルには次のものがあります

class Databases(object):
    def __init__(self):
        for database in INSTALLED_DATABASES:
            setattr(self, database, __import__(database))

これらを次の方法で使用できるようになりました。

from databases import Databases

db = Databases()

for qr in db.DB1.query(db.DB1.User):
    print qr.userid, qr.username

SQLAlchemy を使用すると、モデルを定義するときに列名を手動で指定できます。これは、私が望んでいた標準化にとって大きなメリットです。

私にはまだ多くの仕事が待っています。モデルの検証を強制するオブジェクト (つまり、フィールドが存在するかどうか、存在しないフィールドにデフォルト値があるかどうかなど) を作成し、これが私の IDE でどのように機能するかをよりよく組み込みたいと考えています (現時点ではそうではありません) )。しかし、私は正しい軌道に乗っています。私と同じことをする方法をたまたま疑問に思っている人のために、これを更新すると思いました。

長くなってすみません!

乾杯!

于 2013-05-30T20:30:56.210 に答える