Hello,
I have table "people" and table "accounts", each person can be payer
for any amount of accounts and reciever (perhaps I use wrong word, but
I can't find any better word) for any amount of accounts. This can be
done as two one-to-many relations. I also use backreferences.
And when I say some_account.payer_ = person_a, some_account.reciever_ also gets
changed and vice versa. Using person_a.payer.append(account) gives the
same result.
If dont's use backreferences it work's fine (of course using form
person_a.payer.append(account)), i.e. account.reciever_id doesn't get
changed and stills hold None.
If I remember correctly this was working fine back good old days of SqlAlchemy
1.7
times. (But I like sqlalchemy 0.2.x more anyway :-)
Here's a test script (Also in an attach)
=====================================
from sqlalchemy import *
class SqlStrMixing( object ):
def __init__(self, **kwargs):
for key, value in kwargs.iteritems():
setattr(self, key, value)
def __str__( self ):
s = [ self.__class__.__name__ + ': ' ]
for c in self.c:
s.append( u'%s=%s ' % ( c.key, getattr(self, c.key) ) )
result = ''.join(s).encode( 'cp866' )
return result
engine_uri = 'sqlite:///'
metadata = BoundMetaData(engine_uri, convert_unicode=True)
people = Table('people', metadata,
Column('id', Integer,
primary_key=True),
Column('name', Unicode(100)))
accounts = Table('accounts', metadata,
Column('id', Integer,
primary_key=True),
Column('name', Unicode(100)),
Column('payer_id', Integer,
ForeignKey(people.c.id), index=True, default=None),
Column('reciever_id', Integer,
ForeignKey(people.c.id), index=True, default=None))
metadata.create_all()
class Person(SqlStrMixing):
pass
class Account(SqlStrMixing):
pass
mapper(Account, accounts)
# I use underscore to avoid confusion
properties = {
'payer' : relation(
Account,
primaryjoin=(\
accounts.c.payer_id==people.c.id),
foreignkey=accounts.c.payer_id,
backref='payer_'),
'reciever' : relation(
Account,
primaryjoin=(\
accounts.c.reciever_id==people.c.id),
foreignkey=accounts.c.reciever_id,
backref='reciever_')}
counteragent_mapper = mapper(Person,
people,
properties=properties)
session = create_session(echo_uow=True)
jack = Person(name='Jack')
john = Person(name='John')
acc = Account(name='123')
acc.payer_ = jack
session.save(jack)
session.save(john)
session.save(acc)
session.flush()
session.close()
session = create_session()
query = session.query(Account)
for a in query.select():
print a
=====================================
This scipt prints:
Task dump:
UOWTask(12568752, Person/people/None)
|- Save Person(12529168)
|- Save Person(12529200)
| |-Process Person(12529168).reciever
| |-Process Person(12529200).reciever
| |-Process Account(12529488).payer_
| |-Process Person(12529168).payer
| |-Process Person(12529200).payer
| |-Process Account(12529488).reciever_
|
|- UOWTask(12568912, Account/accounts/None)
| |- Save Account(12529488)
| |----
|
|----
Execute complete
Account: id=1 name=123 payer_id=1 reciever_id=1
====================================================
IMHO task dump with that long changelist on Save Person(12529200)
looks strange, perhaps problem lies somewhere in that place,
or do I have an error in my script?
--
Best regards,
Vasily mailto:[EMAIL PROTECTED]
-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users