oh also your foreign_keys is wrong. PageData has a foreign key to Lang. So foreign_keys=[lang_code], lose the "uselist" which is never necessary except for one-to-one.
On Jul 16, 2012, at 5:18 AM, alex bodnaru wrote: > > hello michael, friends, > > here is my test case. > thanks a lot for your consideraion. please take a look. > > > from sqlalchemy import create_engine > from sqlalchemy.ext.declarative import declarative_base > from sqlalchemy import Column, Integer, String, Unicode, ForeignKeyConstraint > from sqlalchemy.orm import relation, backref, sessionmaker > from sqlalchemy.event import listen > > > engine = create_engine('sqlite:///:memory:', echo=True) > Base = declarative_base() > > class Lang(Base): > __tablename__ = 'lang' > lang_code = Column(String(20), primary_key=True) > lang_name = Column(Unicode(64)) > > class PageData(Base): > __tablename__ = 'pagedata' > lang_code = Column(String(20), primary_key=True) > lang = relation('Lang', backref='pages', > primaryjoin=lang_code==Lang.lang_code, > foreign_keys=[Lang.lang_code], uselist=False) > data = Column(Unicode(64), nullable=True) > > def add_lang_fk(table, conn, **kw): > if 'added_lang_fk' not in table.info: > params = dict(ondelete='cascade') > if conn.dialect.name != 'mssql': > params['onupdate'] = 'restrict' > table.append_constraint( > ForeignKeyConstraint( > ['lang_code'], [Lang.__tablename__ + '.lang_code'], **params)) > table.info['added_lang_fk'] = True > > listen(PageData.__table__, "before_create", add_lang_fk) > > Base.metadata.create_all(engine) > > > Session = sessionmaker(bind=engine) > session = Session() > > de = Lang(lang_code='de', lang_name='Deutsch') > session.add(de) > > data = PageData(lang_code='de', data=u"Vielen Dank im Voraus") #this works > data = PageData(lang=de, data=u"Vielen Dank im Voraus") #this fails > session.add(data) > > session.flush() > > > thanks in advance, > alex > > On 07/15/2012 07:08 PM, Michael Bayer wrote: >> >> On Jul 15, 2012, at 5:53 AM, alex bodnaru wrote: >> >>> >>> hello michael, friends, >>> >>> On 07/11/2012 10:31 AM, alex bodnaru wrote: >>>> >>>> hello michael, >>>> >>>> now it works. i also had to add uselist=False. >>>> >>>> i tried it the longest way possible, by adding a Pool first_connect >>>> listener, >>>> but this was not really needed. just the uselist. >>>> >>>> thanks a lot, >>>> alex >>>> >>> sorry, not yet: >>> >>> the relationship should also allow assignment like this: >>> >>> class Lang(DeclarativeBase): >>> lang_code = Column(String(20), primary_key=True) >>> lang_name = Column(String(20)) >>> >>> class PageData(DeclarativeBase): >>> lang_code = Column(String(20), primary_key=True) >>> lang = relation('Lang', backref='pages', >>> primaryjoin=lang_code==Lang.lang_code, foreign_keys=[Lang.lang_code], >>> uselist=False) >>> >>> the PageData.lang_code foreign key is being added in an event on before >>> create. >>> >>> before delaying creation of the foreign key, i could do like this: >>> >>> p = PageData() >>> p.lang = Lang.get('en') >>> >>> and p.lang_code got assigned. why isn't lang_code being assigned now >>> anymore? >> >> it would imply the relationship is not working at all. >> >> like before: >> >>>>> can you just throw these two classes, the event, and some imports into a >>>>> file for me ? I can just run it. >> >> much quicker than lots of back and forth. >> >> >> >> >> >>> >>> thanks in advance, >>> alex >>>> On 07/09/2012 04:25 PM, Michael Bayer wrote: >>>>> >>>>> On Jul 9, 2012, at 4:48 AM, alex bodnaru wrote: >>>>> >>>>>> >>>>>> hello michael, friends, >>>>>> >>>>>> after successfuly fixing the ddl by the append_constraint event, the >>>>>> relations >>>>>> that needed the said foreign keys remained orphan, asking for a >>>>>> foreign_keys >>>>>> argument and failing to load the remote table: >>>>>> >>>>>> class Lang(DeclarativeBase): >>>>>> lang_code = Column(String(20), primary_key=True) >>>>>> lang_name = Column(String(20)) >>>>>> >>>>>> class PageData(DeclarativeBase): >>>>>> lang_code = Column(String(20), primary_key=True) # this foreign key is >>>>>> being >>>>>> successfully appended on before_create. >>>>>> lang = relation('Lang', backref='pages', >>>>>> primaryjoin=lang_code==Lang.lang_code) #this relationship won't work, >>>>>> since at >>>>>> the moment the class is being made, the foreign key is not there yet. >>>>>> >>>>>> the foreign_keys=Lang.lang_code arg does calm the exception, but doesn't >>>>>> do the >>>>>> work. >>>>>> could i add the relationship to the mapper on the same event? >>>>> >>>>> I would think "foreign_keys" should fix the problem totally, what do you >>>>> mean "doesn't do the work"? I'd have to work up a test case, can you >>>>> just throw these two classes, the event, and some imports into a file for >>>>> me ? I can just run it. >>>>> >>>> well, almost totally ;) >>>> it also needed uselist=False. >>>> >>>>> >>>>>> >>>>>> thank in advance, >>>>>> alex >>>>>> >>>>>> On 07/07/2012 05:13 PM, Michael Bayer wrote: >>>>>>> sure engine and connection have .dialect.name. Foreign key >>>>>>> constraints don't matter on SQLite unless you've actually enabled them, >>>>>>> which is rare. I'd still use an event though so at least the behavior >>>>>>> is transparent. >>>>>>> >>>>>>> @event.listens_for(my_table, "before_create") >>>>>>> def add_fk(table, conn, **kw): >>>>>>> if conn.dialect.name != 'mssql': >>>>>>> table.append_constraint(ForeignKeyConstraint(...)) >>>>>>> >>>>>>> tricky though to modify the table metadata within a "create" event in >>>>>>> the case that the table is created multiple times in an app. you can >>>>>>> put a flag in table.info, like "table.info['added_the_fk'] = True", to >>>>>>> keep track of things. >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Jul 7, 2012, at 12:59 AM, alex bodnaru wrote: >>>>>>> >>>>>>>> >>>>>>>> hello mike and thanks for your answer. >>>>>>>> >>>>>>>> no problem with ForeignKeyConstraint, but wouldn't AddConstraint go >>>>>>>> the alter >>>>>>>> way? in this case, it will be ignored by the sqlite dialect. >>>>>>>> >>>>>>>> what i was looking for was more like: >>>>>>>> >>>>>>>> from sqlalchemy... import get_dialect >>>>>>>> >>>>>>>> .... >>>>>>>> fk_parms = dict(.....) >>>>>>>> if get_dialect() != 'mssql': >>>>>>>> fk_parms.update(onupdate='restrict') >>>>>>>> fk = ForeignKey(**fk_parms) >>>>>>>> >>>>>>>> would the dialect be accessible from the engine, metadata etc? >>>>>>>> >>>>>>>> thanks in advance, >>>>>>>> alex >>>>>>>> >>>>>>>> >>>>>>>> On 07/06/2012 11:39 PM, Michael Bayer wrote: >>>>>>>>> you'd use ForeignKeyConstraint along with the AddConstraint >>>>>>>>> directive, and limit it per-dialect using create/drop events as >>>>>>>>> documented at >>>>>>>>> http://docs.sqlalchemy.org/en/rel_0_7/core/schema.html#controlling-ddl-sequences >>>>>>>>> . >>>>>>>>> >>>>>>>>> >>>>>>>>> On Jul 6, 2012, at 1:30 PM, alex bodnaru wrote: >>>>>>>>> >>>>>>>>>> >>>>>>>>>> hello friends, >>>>>>>>>> >>>>>>>>>> i need to define a foreign key differently for different dialects: >>>>>>>>>> ondelete='restrict' for most engines, but nothing (implied and not >>>>>>>>>> recognized) >>>>>>>>>> for mssql. >>>>>>>>>> >>>>>>>>>> could you help? >>>>>>>>>> >>>>>>>>>> thanks in advance, >>>>>>>>>> alex >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>>> Groups "sqlalchemy" group. >>>>>>>>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>>>>>>>> To unsubscribe from this group, send email to >>>>>>>>>> sqlalchemy+unsubscr...@googlegroups.com. >>>>>>>>>> For more options, visit this group at >>>>>>>>>> http://groups.google.com/group/sqlalchemy?hl=en. >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "sqlalchemy" group. >>>>>>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>>>>>> To unsubscribe from this group, send email to >>>>>>>> sqlalchemy+unsubscr...@googlegroups.com. >>>>>>>> For more options, visit this group at >>>>>>>> http://groups.google.com/group/sqlalchemy?hl=en. >>>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "sqlalchemy" group. >>>>>> To post to this group, send email to sqlalchemy@googlegroups.com. >>>>>> To unsubscribe from this group, send email to >>>>>> sqlalchemy+unsubscr...@googlegroups.com. >>>>>> For more options, visit this group at >>>>>> http://groups.google.com/group/sqlalchemy?hl=en. >>>>>> >>>>> >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "sqlalchemy" group. >>> To post to this group, send email to sqlalchemy@googlegroups.com. >>> To unsubscribe from this group, send email to >>> sqlalchemy+unsubscr...@googlegroups.com. >>> For more options, visit this group at >>> http://groups.google.com/group/sqlalchemy?hl=en. >>> >> > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.