I have a many-to-one relation, let's say between Address and User, both created using Declarative.
I would like it that if an Address references a User, it will create that User, if it doesn't exist. Otherwise, it should use the existing one. There should be no addresses in the table that don't have users. *It could be that my whole sense of modeling is fouled up here, and I appreciate correction.*
1. Is this possible using the current _cascade_ tools? Is so, how is it set up?
2. If not, then what is the best way to handle this?
3. From the docs for "relation" it seems like the cascading is all viewed from the "parent" (one) side, is that correct?
Thanks!
Gregg
-----------------------------------------------------
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relation, backref
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
name = Column(String,primary_key=True)
def __init__(self, name):
self.name = name
def __repr__(self):
return "<User('%s')>" % (
self.name)
class Address(Base):
__tablename__ = 'addresses'
email_address = Column(String, nullable=False, primary_key=True)
user_name = Column(ForeignKey('
users.name'),nullable=False, primary_key=True)
user = relation(User, backref=backref('addresses', order_by=email_address), cascade='all')
def __init__(self, email_address,uname=None):
self.email_address = email_address
self.user_name=uname
def __repr__(self):
return "<Address('%s'), for User('%s')>" % (self.email_address, self.user_name)
def db_setup(connstring='sqlite:///:memory:', echo=False):
engine = create_engine(connstring, echo=echo)
session = sessionmaker(bind=engine, autoflush=False, autocommit=False)()
Base.metadata.bind = engine
Base.metadata.create_all()
return session, engine
session,engine=db_setup('postgres:///test_test',True)
A = Address("me@place","Daniel Waterhouse")
session.add(A)
session.commit()
# fails because no User named Daniel Waterhouse? I want one created. The user_name is enough info to do so.
# otherwise, use the existing one.
----------------------------------