私は、ユーザーがデータベースによって自動的にサポートされるいくつかのクラスを簡単に宣言できるライブラリに取り組んでいます。つまり、コードのどこかに隠されている
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class LibraryBase(Base):
# important library stuff
そして、ユーザーはそれを行う必要があります
class MyStuff(LibraryBase):
# important personal stuff
class MyStuff_2(LibraryBase):
# important personal stuff
mystuff = MyStuff()
Library.register(mystuff)
mystuff.changeIt() # apply some changes to the instance
Library.save(mystuff) # and save it
# same for all other classes
たとえば、ユーザーがすべてのパーソナル クラスを含む 1 つのファイルを作成し、このファイルをインポートするなどの静的環境では、これは非常にうまく機能します。すべてのクラス名は固定されており、SQLAlchemy は各クラスのマッピング方法を認識しています。
インタラクティブな環境では状況が異なります。クラスが 2 回定義される可能性があります。両方のクラスが異なるモジュールを持つ場合があります。それでもSQLAlchemyは文句を言います:
SAWarning: クラス名 'MyStuff' は既にこの宣言ベースのレジストリにあり、< class 'OtherModule.MyStuff' > にマップされています
これに対処する方法はありますか?その定義を新しいものと交換できるように、どうにかしてそのクラスをアンロードできますか?declarative_base