25

時間の経過とともに数が増える複数の外部データ ソースにアクセスするには、SQLAlchemy クラスを作成する必要があります。私たちはコア ORM モデルに宣言ベースを使用しており、autoload=True を使用して新しい ORM クラスを手動で指定し、マッピングを自動生成できることを知っています。

問題は、次のようにして動的に生成できるようにする必要があることです。

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

stored={}
stored['tablename']='my_internal_table_name'
stored['objectname']='MyObject'

そしてそれを動的に次のようなものに変えます:

class MyObject(Base):
    __tablename__ = 'my_internal_table_name'
    __table_args__ = {'autoload':True}

接続を開き、クエリを実行し、接続を閉じるために、クラスが必要以上に長く存続することは望ましくありません。したがって、理想的には、上記の「格納された」変数のアイテムをデータベースに配置し、必要に応じてそれらをプルできます。もう 1 つの課題は、オブジェクト名 ("MyObject" など) がさまざまな接続で使用される可能性があるため、一度定義してそのままにしておくことができないことです。

これをどのように達成できるかについての提案は大歓迎です。

ありがとう...

4

1 に答える 1

32

への3 引数呼び出しをMyObject使用して動的に作成できます。type

type(name, bases, dict)

    Return a new type object. This is essentially a dynamic form of the 
    class statement... 

例えば:

mydict={'__tablename__':stored['tablename'],
        '__table_args__':{'autoload':True},}

MyObj=type(stored['objectname'],(Base,),mydict)
print(MyObj)
# <class '__main__.MyObject'>
print(MyObj.__base__)
# <class '__main__.Base'>
print(MyObj.__tablename__)
# my_internal_table_name
print(MyObj.__table_args__)
# {'autoload': True}
于 2010-05-04T20:47:26.223 に答える