Thanks for the advice, and sorry I didn't provide the correct
information, but ctx.current.flush() makes no difference.
r.cancelled_user is (nearly: 19/20) always None immediately after the
assign and flush with no database access being made. Interestingly,
the user_id/user relationship is always correct
I will just have to stick to using the hack on the Receipt object to
get the cancelled_user until I am more familiar with SA to work out
what is going on.
Ali
Missing Tables:
suppliers_table = Table('supplier', meta,
Column('id', Integer, autoincrement=True, primary_key=True),
Column('name', String),
Column('address', String),
Column('postcode', String),
Column('telephone', String),
)
class Supplier(NamedObject):
"""Supplier"""
def get_long_string(self):
return '%s (%s %s %s)' % (self.name, self.address,
self.postcode, self.telephone)
assign_mapper(ctx, Supplier, suppliers_table)
forms_table = Table('form', meta,
Column('id', Integer, autoincrement=True, primary_key=True),
Column('name', String),
)
class Form(NamedObject):
"""Drug Form"""
assign_mapper(ctx, Form, forms_table)
drugs_table = Table('drug', meta,
Column('id', Integer, autoincrement=True, primary_key=True),
Column('name', String),
Column('strength', String),
Column('stock', Integer),
Column('form_id', Integer, ForeignKey('form.id'))
)
class Drug(object):
"""Drug Definition"""
def __str__(self):
return '%s (%s %s)' % (self.name, self.form, self.strength)
str = property(__str__)
assign_mapper(ctx, Drug, drugs_table,
properties = dict(
form = relation(Form, backref='drugs')
)
)
On Feb 20, 9:04 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
> well I cant run the program since its not complete (no Drug, Supplier
> class/tables defined, etc), but if id hazard a guess id say you
> shouldnt be calling "flush()" on your class instances, since it will
> not flush any changes on any dependencies. call ctx.current.flush()
> instead.
>
> On Feb 20, 2007, at 1:40 PM, Ali wrote:
>
>
>
> > Ok,
>
> > from sqlalchemy import *
>
> > from sqlalchemy.ext.assignmapper import assign_mapper
> > from sqlalchemy.ext.sessioncontext import SessionContext
>
> > meta = DynamicMetaData()
>
> > ctx = SessionContext(create_session)
>
> > def make_engine(uri=None):
> > if uri is None:
> > uri = 'sqlite:///:memory:'
> > engine = create_engine(uri, echo=True)
> > return engine
>
> > def connect(uri=None):
> > meta.connect(make_engine(uri=uri))
>
> > users_table = Table('user', meta,
> > Column('id', Integer, autoincrement=True, primary_key=True),
> > Column('name', String),
> > Column('password', String),
> > Column('registration', String),
> > )
>
> > class User(object):
> > """User"""
> > def get_is_admin(self):
> > return self.id == 1
> > is_admin = property(get_is_admin)
>
> > def __str__(self):
> > s = self.name
> > if self.registration:
> > s = '%s (%s)' % (s, self.registration)
> > return s
>
> > assign_mapper(ctx, User, users_table)
>
> > stockreceipt_table = Table('stockreceipt', meta,
> > Column('id', Integer, autoincrement=True, primary_key=True),
> > Column('drug_id', Integer, ForeignKey('drug.id')),
> > Column('date', Date),
> > Column('quantity', Integer),
> > Column('supplier_id', Integer, ForeignKey('supplier.id')),
> > Column('user_id', Integer, ForeignKey('user.id')),
> > Column('cancelled', Boolean),
> > Column('cancelled_reason', String),
> > Column('cancelled_user_id', Integer, ForeignKey('user.id')),
> > Column('internal_transfer', Boolean),
> > Column('invoice_number', String),
> > Column('internal_from', String),
> > )
>
> > class Receipt(object):
> > """Stock Receipt"""
> > def get_cancelled_user_hack(self):
> > return User.get_by(id=self.cancelled_user_id)
> > cancelled_user_hack = property(get_cancelled_user_hack)
>
> > assign_mapper(ctx, Receipt, stockreceipt_table,
> > properties=dict(
> > user=relation(User, backref='receipts',
> > primaryjoin=stockreceipt_table.c.user_id ==
> > users_table.c.id),
> > cancelled_user=relation(User, backref='cancelled_receipts',
> > lazy=False,
> > primaryjoin=stockreceipt_table.c.cancelled_user_id ==
> > users_table.c.id),
> > supplier=relation(Supplier, backref='receipts'),
> > drug=relation(Drug, backref='receipts'),
> > )
> > )
>
> > meta.create_all()
> > connect()
>
> >>>> u = User(name='Ali')
> >>>> u.flush()
> >>>> r = Receipt(user_id=u.id)
> >>>> r.flush()
> >>>> r.user is u
> > True
> >>>> r.cancelled_user_id = u.id
> >>>> r.flush()
> >>>> r.cancelled_user is u
> > True
>
> > Now, as I mentioned, r.cancelled_user is set correctly in this
> > example, but not (always) in my application, although it is used
> > similarly. (I am happy to paste 2000 lines of PyGTK if you like). When
> > the attribute is accessed, there is no SQL output at all, although in
> > this example there is.
>
> > Thanks for any assistance,
>
> > Ali
>
> > On Feb 20, 6:04 pm, "Michael Bayer" <[EMAIL PROTECTED]> wrote:
> >> why dont you attach a script that runs completely ? use a
> >> "sqlite://"
> >> database.
>
> >> On Feb 20, 12:14 pm, "Ali" <[EMAIL PROTECTED]> wrote:
>
> >>> By "both", I mean user and receipt tables
>
> >>> On 20 Feb, 17:12, "Ali" <[EMAIL PROTECTED]> wrote:
>
> >>>> I left out the fields for brevity of example. They both have an id
> >>>> column defined as primary keys.
>
> >>>> On 20 Feb, 17:11, "Michael Bayer" <[EMAIL PROTECTED]> wrote:
>
> >>>>> On Feb 20, 12:01 pm, "Ali" <[EMAIL PROTECTED]> wrote:
>
> >>>>>> Here is my code (with other fields removed):
>
> >>>>>> stockreceipt_table = Table('stockreceipt', meta,
> >>>>>> Column('user_id', Integer, ForeignKey('user.id')),
> >>>>>> # Cancellation
> >>>>>> Column('cancelled_user_id', Integer, ForeignKey('user.id')),
> >>>>>> )
>
> >>>>>> class Receipt(object):
> >>>>>> """Stock Receipt"""
>
> >>>>>> assign_mapper(ctx, Receipt, stockreceipt_table,
> >>>>>> properties=dict(
> >>>>>> user=relation(User, backref='receipts',
> >>>>>> primaryjoin=stockreceipt_table.c.user_id ==
> >>>>>> users_table.c.id),
> >>>>>> cancelled_user=relation(User,
> >>>>>> backref='cancelled_receipts',
> >>>>>> lazy=False,
> >>>>>> primaryjoin=stockreceipt_table.c.cancelled_user_id ==
> >>>>>> users_table.c.id),
> >>>>>> )
>
> >>>>> that cant be right, since theres no primary key expressed
> >>>>> either in
> >>>>> the stockreceipt_table or in your Receipt mapper.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---