EE_log_declarative.py
によって生成され、宣言されたすべてのクラスを含むファイルがありsqlacodegen engine --outfile declarative_model.py
ます。これは、BigInteger、Boolean、ForeignKey、String などのすべてのデータ型をクラスとしてインポートする以下のようなものです。
from sqlalchemy import BigInteger, Boolean, ForeignKey, String
Base = declarative_base()
metadata = Base.metadata
class DataProvider(Base):
__tablename__ = 'data_provider'
...
class DatePattern(Base):
__tablename__ = 'date_pattern'
...
私の質問は、テーブル名が関連付けられているクラスのみを取得するにはどうすればよいですか?
1 つのクラス定義でクラス オブジェクトを取得するには、現在行っていますが、次のように動作します。
EE_log_declarative.Base.metadata.bind = engine
DBSession = sessionmaker()
DBSession.bind = engine
session = DBSession()
data_provider_account_object =session.query(EE_log_declarative.DataProvider).all()
date_pattern_object = session.query(EE_log_declarative.DatePattern).all()
アイデアは、クラス オブジェクトを動的に取得することです。宣言型と同じ数のクラスを取得しますが、テーブル名を持つクラス オブジェクトのみを構築します。
for x in dir(EE_log_declarative):
attributes = getattr(EE_log_declarative, x)
is_class = isclass(attributes)
if is_class:
try:
object = session.query(EE_log_declarative, x).all()
all_class.append(object)
except:
pass
基本的に、最新の関数では、テーブル名が関連付けられているクラス オブジェクトのみを追加したいのですが、x が文字列として渡されるため、実際には機能しません。