python - SQLAlchemy not producing proper SQL statement for multi column UniqueConstraints -


below 2 different attempts have made in trying achieve multi-column unique constraint in sqlalchemy, both of seems have failed since proper sql statement not being produced.

the attempts:

from sqlalchemy import column, integer, string, text, foreignkey, datetime, create_engine, uniqueconstraint, boolean sqlalchemy.orm import relationship, backref, sessionmaker sqlalchemy.ext.declarative import declarative_base sqlalchemy.interfaces import poollistener import sqlalchemy  class foreignkeyslistener(poollistener):     def connect(self, dbapi_con, con_record):         db_cursor = dbapi_con.execute('pragma foreign_keys=on')  engine = create_engine(r"sqlite:///" + r"d:\\foo.db",                        listeners=[foreignkeyslistener()], echo = true) session = sessionmaker(bind = engine) ses = session() base = declarative_base() print sqlalchemy.__version__ class foo(base):     __tablename__ = "foo"      id = column(integer, primary_key=true)     dummy = column(integer, unique = true) class bar(base):     __tablename__ = "bar"     id = column(integer, primary_key=true)     baz = column(integer, foreignkey("foo.id"))     qux = column(integer, foreignkey("foo.id"))     uniqueconstraint("baz", "qux")  class cruft(base):     __tablename__ = "cruft"      id = column(integer, primary_key=true)     bar = column(integer, foreignkey("foo.id"))     qux = column(integer, foreignkey("foo.id"))     __table_args = (uniqueconstraint("bar", "qux"),) base.metadata.create_all(engine) 

the output:

>>> 0.8.2 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine pragma table_info("foo") 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine () 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine pragma table_info("bar") 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine () 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine pragma table_info("cruft") 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine () 2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine  create table foo (     id integer not null,      dummy integer,      primary key (id),      unique (dummy) )   2013-05-09 16:25:42,677 info sqlalchemy.engine.base.engine () 2013-05-09 16:25:42,767 info sqlalchemy.engine.base.engine commit 2013-05-09 16:25:42,769 info sqlalchemy.engine.base.engine  create table bar (     id integer not null,      baz integer,      qux integer,      primary key (id),      foreign key(baz) references foo (id),      foreign key(qux) references foo (id) )   2013-05-09 16:25:42,769 info sqlalchemy.engine.base.engine () 2013-05-09 16:25:42,838 info sqlalchemy.engine.base.engine commit 2013-05-09 16:25:42,839 info sqlalchemy.engine.base.engine  create table cruft (     id integer not null,      bar integer,      qux integer,      primary key (id),      foreign key(bar) references foo (id),      foreign key(qux) references foo (id) )   2013-05-09 16:25:42,839 info sqlalchemy.engine.base.engine () 2013-05-09 16:25:42,917 info sqlalchemy.engine.base.engine commit 

any suggestions?

when using uniqueconstraint in declarative table configuration, need specify using __table_args__ attribute (note underscores on both sides of name:

class bar(base):     __tablename__ = "bar"     __table_args__ = (uniqueconstraint("baz", "qux"),)      id = column(integer, primary_key=true)     baz = column(integer, foreignkey("foo.id"))     qux = column(integer, foreignkey("foo.id"))  class cruft(base):     __tablename__ = "cruft"     __table_args__ = (uniqueconstraint("bar", "qux"),)      id = column(integer, primary_key=true)     bar = column(integer, foreignkey("foo.id"))     qux = column(integer, foreignkey("foo.id")) 

the attribute must either tuple or dictionary.

creating these 2 tables results in:

2013-05-09 13:38:44,180 info sqlalchemy.engine.base.engine  create table cruft (     id integer not null,      bar integer,      qux integer,      primary key (id),      unique (bar, qux),      foreign key(bar) references foo (id),      foreign key(qux) references foo (id) )  ...  2013-05-09 13:38:44,181 info sqlalchemy.engine.base.engine  create table bar (     id integer not null,      baz integer,      qux integer,      primary key (id),      unique (baz, qux),      foreign key(baz) references foo (id),      foreign key(qux) references foo (id) ) 

also see setting constraints when using declarative orm extension section of defining constraints , indexes chapter.


Comments

Popular posts from this blog

linux - xterm copying to CLIPBOARD using copy-selection causes automatic updating of CLIPBOARD upon mouse selection -

c++ - qgraphicsview horizontal scrolling always has a vertical delta -