SQLAlchemy declarative syntax with autoload (reflection) in Pylons
OK, I think I figured it out. The solution is to declare the model objects outside the model/__init__.py
. I concluded that __init__.py
gets imported as the first file when importing something from a module (in this case model
) and this causes problems because the model objects are declared before init_model()
is called.
To avoid this I created a new file in the model
module, e.g. objects.py
. I then declared all my model objects (like Event
) in this file.
Then, I can import my models like this:
from PRJ.model.objects import Event
Furthermore, to avoid specifying autoload-with
for each table, I added this line at the end of init_model()
:
Base.metadata.bind = engine
This way I can declare my model objects with no boilerplate code, like this:
class Event(Base):
__tablename__ = 'events'
__table_args__ = {'schema': 'events', 'autoload': True}
event_identifiers = relationship(EventIdentifier)
def __repr__(self):
return "<Event(%s)>" % self.id
I just tried this using orm module.
Base = declarative_base(bind=engine)
Base.metadata.reflect(bind=engine)
Accessing tables manually or through loop or whatever:
Base.metadata.sorted_tables
Might be useful.