from sqlalchemy import Column, ForeignKey, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative.base import _declarative_constructor
from sqlalchemy.orm import Session, relationship, sessionmaker
from sqlalchemy.orm.dynamic import AppenderQuery
class BaseBase(object):
def __init__(self, **kwargs):
_declarative_constructor(self, **kwargs)
session.add(self)
session.commit()
Base = declarative_base(cls=BaseBase, constructor=BaseBase.__init__)
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
label = Column(String)
parent_id = Column(Integer, ForeignKey('node.id'))
parent = relationship('Node', remote_side=id, back_populates='children')
children = relationship('Node', back_populates='parent')
def __repr__(self):
return self.label
if __name__ == '__main__':
engine = create_engine('sqlite://', echo=True)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine, expire_on_commit=False)
session = Session()
node = Node(label='root')
# Accessing children for first time so query is made
print node.children
child1 = Node(label='child1', parent_id=node.id)
# Accessing children again so no query is made and child1 is not there
print node.children
child2 = Node(label='child2', parent=node)
# Accessing children again so no query is made and child1 is not there,
but child2 is there
print node.children
In my MCVE I have expire_on_commit=False. When I access node.children for
the first time, it makes that query. When I create child1 specifying
parent_id, it doesn't update node.children.
I am converting a codebase from SQLObject, which queries every time you
access many-to-one field. With SQLAlchemy I know I can specify
lazy='dynamic' in children relationship, but that returns a query object so
I'd have to do node.children.all().
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.