Hello, I'm attaching the test case for this issue. The test case includes some ifs to prevent too many objects to be created and/or to help testing.
Unmodified, this will output: [] 0 [] 0 [] 0 just changing the CustomMapperExtension if to False (effectively deleting the create_instance override) restores full software functionality. I couldn't understand what's the problem - just to let you know, my software worked 100% until i reached this many-to-many relations part - manytoone and onetomany work fine. -- Alan Franzoni <[EMAIL PROTECTED]> - Togli .xyz dalla mia email per contattarmi. Remove .xyz from my address in order to contact me. - GPG Key Fingerprint (Key ID = FE068F3E): 5C77 9DC3 BD5B 3A28 E7BC 921A 0255 42AA FE06 8F3E --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---
from sqlalchemy import * import random import string import sys import logging random.seed() #quick random string recipe by Pradeep Kishore Gowda found on ASPN def nicepass(alpha=6,numeric=2): """ returns a human-readble password (say rol86din instead of a difficult to remember K8Yn9muL ) """ vowels = ['a','e','i','o','u'] consonants = [a for a in string.ascii_lowercase if a not in vowels] digits = string.digits ####utility functions def a_part(slen): ret = '' for i in range(slen): if i%2 ==0: randid = random.randint(0,20) #number of consonants ret += consonants[randid] else: randid = random.randint(0,4) #number of vowels ret += vowels[randid] return ret def n_part(slen): ret = '' for i in range(slen): randid = random.randint(0,9) #number of digits ret += digits[randid] return ret #### fpl = alpha/2 if alpha % 2 : fpl = int(alpha/2) + 1 lpl = alpha - fpl start = a_part(fpl) mid = n_part(numeric) end = a_part(lpl) return "%s%s%s" % (start,mid,end) postgres_engine = create_engine("postgres://user:[EMAIL PROTECTED]:5432/testsa", echo=False, encoding="utf8", convert_unicode=True) metadata = BoundMetaData(postgres_engine) editore = Table("editore", metadata, Column("id", Integer, Sequence("editore_id_seq"), primary_key=True ), Column("editore", String(40), nullable=False, unique=True), Column("edit_indirizzo", String(60)), Column("edit_telefono", String(30)), Column("edit_sito", String(80)), Column("edit_email", String(50)), Column("edit_note", TEXT), Column("last_upd", DateTime) ) reparto = Table("reparto", metadata, Column("id", Integer, Sequence("reparto_id_seq"), primary_key=True), Column("reparto", String(15), nullable=False, unique=True), Column("rep_descrizione", String(60) ), Column("aliq", Integer ), Column("last_upd", DateTime) ) editorereparto = Table("editorereparto", metadata, Column("editore_id", Integer, ForeignKey("editore.id"), primary_key=True), Column("reparto_id", Integer, ForeignKey("reparto.id"), primary_key=True), Column("last_upd", DateTime), ) formato = Table("formato", metadata, Column("id", Integer, Sequence("formato_id_seq"), primary_key=True, nullable=False, ), Column("formato", String(20), nullable=False, unique=True), Column("form_descr", String(60)), Column("last_upd", DateTime), ) formatoreparto = Table("formatoreparto", metadata, Column("reparto_id", Integer, ForeignKey("reparto.id"), primary_key=True), Column("formato_id", Integer, ForeignKey("formato.id"),primary_key=True ), Column("last_upd", DateTime), ) metadata.create_all() class Reparto(object): pass class Editore(object): pass class Formato(object): pass class CustomMapperExtension(MapperExtension): #choose whether to override default create_instance if True: def create_instance(self, mapper, selectcontext, row, class_): return class_() CustomExt=CustomMapperExtension() Reparto.mapper = mapper(Reparto, reparto, extension=CustomExt) Editore.mapper = mapper(Editore, editore, extension=CustomExt) Formato.mapper = mapper(Formato, formato, extension=CustomExt) #mtm properties block - without backref if True: Reparto.mapper.add_property("editori", relation(Editore, secondary=editorereparto, lazy=True, cascade="all")) #)) Reparto.mapper.add_property("formati", relation(Formato, secondary=formatoreparto, lazy=True, cascade="all")) #)) Editore.mapper.add_property("reparti", relation(Reparto, secondary=editorereparto, lazy=True, cascade="all")) #)) Formato.mapper.add_property("reparti", relation(Reparto, secondary=formatoreparto, lazy=True, cascade="all")) #)) #end mtm properties block - without backref ##mtm properties block - with backref #if True: # Reparto.mapper.add_property("editori", relation(Editore, secondary=editorereparto, # lazy=False, cascade="all", backref="reparti")) # #)) # Reparto.mapper.add_property("formati", relation(Formato, secondary=formatoreparto, # lazy=False, cascade="all", backref="reparti")) ##end mtm properties block - with backref Reparto.mapper.compile() Formato.mapper.compile() Editore.mapper.compile() session = create_session() #choose whether to create new random objects if True: #create some dummy objects for mapped_class in (Formato, Reparto, Editore): newobj = mapped_class() setattr(newobj, mapped_class.__name__.lower(), nicepass(10,1)) session.save(newobj) session.flush() session.clear() #choose whether to create new random relations if True: #create some random relations for rep in session.query(Reparto).select()*3: print "adding random relation" rand_form = random.choice(session.query(Formato).select()) rand_edit = random.choice(session.query(Editore).select()) if rand_form not in rep.formati: print "adding random formatoreparto relation" rep.formati.append(rand_form) if rand_edit not in rep.editori: print "adding random editorereparto relation" rep.editori.append(rand_edit) session.flush() session.clear() rep = session.query(Reparto).get_by(id=1) edit = session.query(Editore).get_by(id=1) form = session.query(Formato).get_by(id=1) print rep.formati, len(rep.formati) print edit.reparti, len(edit.reparti) print form.reparti, len(form.reparti)