私は現在、株式のポートフォリオを処理し、財務分析を行うことができるPython(3.6)の小さなアプリケーションに取り組んでいます。SQLAlchemy ORM reconstructorの代替
機能は、私のポートフォリオと株のCRUDインターフェイス(作成、読み取り、更新、削除)です。に位置
- のビジネスロジック '(:彼らは
ものがある(ORMとしてPostgreSQLとSQLAlchemyの使用)dabaseに永続化することができ、私は間絶対デカップリングを持つ目指しています私はPythonが
Stock
、Portfolio
、Regression
など - すべてSQLAlchemyのメタデータと
core
パッケージのオブジェクトとのマッピングがある()を分離パッケージdatabase
にある「永続化層を」、オブジェクトを持っているパッケージcore
)、 def私はいくつかの理由から、この分離をしたい
をINED:最初の私は、スタンドアロンでcore
パッケージを起動できるようにする(任意のDBがインストールされていないどちらともさえSQLAlchemyの)と、第二に、私は、それは良い習慣だと思います私core
パッケージには、私は本当に分析に焦点を当てることができるためにすぎず、低レベルのSQLAlchemyのを使用して、私は今のところそれを行うには、管理などSQLA Column
、relationships
、
と私のPythonオブジェクトを「汚染」mapper
とTable
。 しかし、私が理解できない点は1つだけです。現在、私のPython Stock
オブジェクトは次のようである:
class Stock:
def __init__(self, ticker: str, exchange: Exchange, name: str=None):
self.ticker = ticker
self.exchange = exchange
self.name = name
self._data = None
...
_data
プロパティは私の財務データを格納するために必要な、と私はそれをインスタンス化したいです。あなたは私がsession.query(Stock).first()
のようなコマンドを使用して、たとえば、(私は実際にdatabase
PKGを使用する場合)、データベースからStock
をロードする際に、その__init__
機能がSQLAによって呼び出されていない、知っているかもしれないとして
しかし、 。私にできる唯一のことは、機能を追加している:orm
がsqlalchemy.orm
で、私のcore
PKGでsqlalchemy
のだけ輸入です
@orm.reconstructor
def init_on_load(self):
self._data = None
。私はそれを取り除きたいです!
アイデアはありますか?たとえばを通じてdatabase
パッケージ内の_data
プロパティをインスタンス化する方法がありますが、わかりません。
おかげ
デフォルト値(この場合は 'None')が必要な場合は、' _data = None'をクラスレベルに置くことはできませんか? – univerio
"[' reconstructor() '](http://docs.sqlalchemy.org/en/latest/orm/constructors.html#sqlalchemy.orm.reconstructor)は、より大きな「インスタンスレベル」イベントのシステムへのショートカットです。これらは、イベントAPIを使用してサブスクライブすることができます。これらのAPIの完全な説明については、[InstanceEvents](http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.InstanceEvents)を参照してください。イベント "、そのうちの[' load'](http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.InstanceEvents.load)に興味があるかもしれません。 –
ありがとうございます。私は、イベント管理セクション、特にこのロードイベントを見て、あなたの言葉を引用して私の解答を投稿します。あなたが好きなのであれば、答えとしてあなたのコメントを再投稿して、私がそれを検証できるようにしてください! – Edouardb