On 09/22/2016 01:29 PM, Chris Withers wrote:
On 22/09/2016 14:55, Mike Bayer wrote:

On 09/22/2016 07:30 AM, Chris Withers wrote:
How do you control the order in which columns are added to a
multi-column primary key when using the declarative primary_key=True
syntax?
How about when one of those columns comes from a mixin?

without mixins, the columns are processed in the order that they were
created - they all have a global "created index" number that is
consulted outside of the order in which the objects appear on a
declarative class.

Right, so you'd just re-order the columns...

With mixins, that all gets screwed up.  In that case you'd use a
PrimaryKeyConstraint() object on the final mapped class and that will
express the ordering of the columns.

...which I guess I'd want to introspect and then form that final
PrimaryKeyConstraint. How would I do that in this mixin:

https://github.com/Mortar/mortar_mixins/blob/master/mortar_mixins/temporal.py


...while also removing the primary key generated by the primary_key=True
on the various columns?

you know I bet you could use an event hook to just catch that when the Table is first set up and just re-set the PrimaryKeyConstraint. I thought this could be done with a simple after_parent_attach but that seems to occur in an inopportune place. so we'll get the table when it's done totally:

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy import event, PrimaryKeyConstraint


Base = declarative_base()


@event.listens_for(Base, "instrument_class", propagate=True)
def instrument_class(mapper, class_):
    mapper.local_table.append_constraint(
        PrimaryKeyConstraint(
            *sorted(list(mapper.local_table.primary_key),
                    key=lambda column: column.key))
    )


class Z(object):
    z = Column(Integer, primary_key=True)


class A(Z, Base):
    __tablename__ = 'a'
    x = Column(Integer, primary_key=True)
    y = Column(Integer, primary_key=True)


from sqlalchemy.schema import CreateTable
print CreateTable(A.__table__)











cheers,

Chris


--
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.

Reply via email to