Je travaille actuellement sur une petite application en Python (3.6) capable de gérer des portefeuilles de titres, et d'en faire une analyse financière.Alternative à SQLAlchemy ORM reconstructor
Les fonctionnalités sont simplement une interface CRUD (Créer, Lire, Mettre à jour, Supprimer) pour mes portefeuilles et actions. Ils peuvent être conservées dans un dabase (en utilisant PostgreSQL et SQLAlchemy comme ORM)
La chose est, je visais d'avoir un découplage absolu entre:
- La « logique métier » (situé dans un package
core
), où je mes objets pythonStock
,Portfolio
,Regression
, etc. - la « couche de persistance », (situé dans un paquet séparé
database
), où toutes les métadonnées de SQLAlchemy et la mise en correspondance avec les objets de l'emballagecore
sont def INED
Je veux cette séparation pour plusieurs raisons: d'abord, je veux être en mesure de lancer le paquet core
en mode autonome (avec ni aucune DB installé ni même SQLAlchemy) et, d'autre part, je pense qu'il est une bonne pratique, parce que dans mon paquet core
, je peux vraiment se concentrer sur l'analyse et ne « polluer » mes objets Python avec le SQLA Column
, relationships
, etc.
j'ai réussi à le faire jusqu'à présent, en utilisant le SQLAlchemy bas niveau mapper
et Table
. Cependant, il y a un seul point que je ne peux pas comprendre. Actuellement, mon objet Python Stock
est comme:
class Stock:
def __init__(self, ticker: str, exchange: Exchange, name: str=None):
self.ticker = ticker
self.exchange = exchange
self.name = name
self._data = None
...
La propriété _data
est nécessaire pour stocker mes données financières, et je veux instancier.
Mais, comme vous le savez, quand je charge une Stock
de la base de données, (dans le cas où je l'utilise en fait le database
pkg), par exemple via une commande comme session.query(Stock).first()
, la fonction __init__
est pas appelée par SQLA . La seule chose que je peux faire est d'ajouter une fonction:
@orm.reconstructor
def init_on_load(self):
self._data = None
où orm
est sqlalchemy.orm
et est le seul importation de sqlalchemy
dans mon core
pkg. Je voudrais m'en débarrasser!
Est-ce que quelqu'un a une idée? Par exemple, il existe peut-être un moyen d'instancier la propriété _data
à l'intérieur du package database
, via le mapper
, mais je n'en sais pas.
Merci
Si tout ce dont vous avez besoin est une valeur par défaut ('None' dans ce cas), ne pouvez-vous pas simplement mettre' _data = None' au niveau de la classe? – univerio
"[' reconstructor() '] (http://docs.sqlalchemy.org/en/latest/orm/constructors.html#sqlalchemy.orm.reconstructor) est un raccourci vers un plus grand système d'événements de" niveau instance ", qui peut être abonné à l'aide de l'API d'événement - voir [InstanceEvents] (http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.InstanceEvents) pour la description complète de l'API de ces events. ", dont [' load'] (http://docs.sqlalchemy.org/en/latest/orm/events.html#sqlalchemy.orm.events.InstanceEvents.load) pourrait vous intéresser. –
Merci pour votre réponse. Je jetterai un coup d'oeil à la section de gestion d'événements, et particulièrement à cet événement de charge, et posterai une réponse avec ma solution, en vous citant. Ou si vous préférez, vous pouvez rediffuser votre commentaire en réponse, afin que je puisse le valider! – Edouardb