What is the proper way to get pluralized shortened names for many-to-many tables when using automap? I currently have it set to generate pluralized lowercase names for collections instead of the default "_collection". This is what I want for one-to-many or many-to-one relationships, but not many-to-many. For example, I have two tables, hdu, and extcol, joined together through a many-to-many table, hdu_to_extcol
create table hdu (pk serial primary key not null, extname_pk integer, exttype_pk integer, extno integer, file_pk integer); create table hdu_to_extcol (pk serial primary key not null, hdu_pk integer, extcol_pk integer); create table extcol (pk serial primary key not null, name text); ALTER TABLE ONLY mangadapdb.hdu_to_extcol ADD CONSTRAINT hdu_fk FOREIGN KEY (hdu_pk) REFERENCES mangadapdb.hdu(pk) ON UPDATE CASCADE ON DELETE CASCADE; ALTER TABLE ONLY mangadapdb.hdu_to_extcol ADD CONSTRAINT extcol_fk FOREIGN KEY (extcol_pk) REFERENCES mangadapdb.extcol(pk) ON UPDATE CASCADE ON DELETE CASCADE; When I use SQLalchemy to automap the Base classes, the relationship this generates on the Hdu and Extcol classes are *Hdu.hdu_to_extcol, and Extcol.hdu_to_extcols*, using the below pluralize, and relationship, code. However, ideally what I'd like the names to be are *Hdu.extcols, and Extcol.hdus*, respectively. What's the best to generate this for these many-to-many tables? I'm not sure if automap is recognizing these as many-to-many tables. The direction indicated when I print during the relationship stage don't indicate as such. symbol('ONETOMANY') <class 'sqlalchemy.ext.automap.Extcol'> extcol symbol('MANYTOONE') <class 'sqlalchemy.ext.automap.HduToExtcol'> hdu_to_extcol symbol('ONETOMANY') <class 'sqlalchemy.ext.automap.Hdu'> hdu symbol('MANYTOONE') <class 'sqlalchemy.ext.automap.HduToExtcol'> hdu_to_extcol Here is my Base class generation code. def _gen_relationship(base, direction, return_fn, attrname, local_cls, referred_cls, **kw): if local_cls.__table__.name in onetoones: kw['uselist'] = False # make use of the built-in function to actually return the result. return generate_relationship(base, direction, return_fn, attrname, local_cls, referred_cls, **kw) _pluralizer = inflect.engine() def pluralize_collection(base, local_cls, referred_cls, constraint): referred_name = referred_cls.__name__ uncamelized = re.sub(r'[A-Z]', lambda m: "_%s" % m.group(0).lower(), referred_name)[1:] pluralized = _pluralizer.plural(uncamelized) return pluralized # Grabs engine db = DatabaseConnection() engine = db.engine # Selects schema and automaps it. metadata = MetaData(schema='mangadapdb') Base = automap_base(bind=engine, metadata=metadata) Base.prepare(engine, reflect=True, classname_for_table=camelizeClassName, name_for_collection_relationship=pluralize_collection, generate_relationship =_gen_relationship) # Explicitly declare classes for cl in Base.classes.keys(): exec('{0} = Base.classes.{0}'.format(cl)) -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.