1

database.py ファイルでまったく異なるモデルを使用して 2 つのデータベースを初期化したいと考えています。

データベース.py

engine1 = create_engine(uri1)
engine2 = create_engine(uri2)

session1 = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine1))
session2 = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine2))

Base = declarative_base(name='Base')
Base.query = session1.query_property()

LogBase = declarative_base(name='LogBase')
LogBase.query = session2.query_property()

および 2 つのモデル構造:

models.py

class MyModel(Base):
    pass

models2.py

class MyOtherModel(LogBase):
    pass

モデルをインポートした後にデータベースを作成/初期化するdatabase.pyに戻ります

# this does init the database correctly
def init_db1():
    import models
    Base.metadata.create_all(bind=engine1)

# this init function doeas not work properly
def init_db2():
    import models2
    LogBase.metadata.create_all(bind=engine2)

2番目のinit関数でインポートを変更すると機能します

def init_db2():
    from models2 import *
    LogBase.metadata.create_all(bind=engine2)

しかし、警告があります:

database.py:87: SyntaxWarninyntaxWarning: import * モジュール レベルでのみ許可

すべてが正常に動作し、データベースは初期化されていますが、警告は何か問題があることを示しています。

最初の試行が正しくない理由を誰かが説明できれば、私は感謝します。ありがとう。

4

1 に答える 1

2

実際、from ... import *関数内で構文を使用することはお勧めできません。これは、Python がその関数のローカル名を判別できず、スコープ規則に違反するためです。とにかく Python が機能するようにするには、特定の最適化を無効にする必要があり、その結果、名前の検索が大幅に遅くなります。

そうしないと、問題を再現できません。インポートは、クラスがすべての宣言のレジストリを持つmodels2ように、そのモジュールで定義されたすべてが実行されることを確認するだけです。do の宣言がLogBase機能している間、そのパスが失敗する理由はありません。models.pyBase

SQLAlchemy と宣言的なテーブル メタデータの目的では、と の構文に違いはありません。ローカル名前空間への影響のみが異なります。どちらの場合も、最上位のコードが実行され、クラスが定義されます。ただし、後者の場合、モジュールの最上位の名前は、ローカル名前空間への単なる参照ではなく、直接参照としてローカル名前空間に追加されます。モジュール オブジェクトが追加されています。import models2from models2 import *models2

于 2013-05-11T14:55:31.587 に答える