from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy import ForeignKey
+from sqlalchemy import ForeignKeyConstraint
+from sqlalchemy import Index
from sqlalchemy import inspect
from sqlalchemy import Integer
from sqlalchemy import join
from sqlalchemy import select
from sqlalchemy import String
+from sqlalchemy import testing
+from sqlalchemy import UniqueConstraint
from sqlalchemy.orm import clear_mappers
from sqlalchemy.orm import column_property
from sqlalchemy.orm import declarative_base
from .history_meta import Versioned
from .history_meta import versioned_session
-
warnings.simplefilter("error")
],
)
+ @testing.variation(
+ "constraint_type",
+ [
+ "index_single_col",
+ "composite_index",
+ "explicit_name_index",
+ "unique_constraint",
+ "unique_constraint_naming_conv",
+ "unique_constraint_explicit_name",
+ "fk_constraint",
+ "fk_constraint_naming_conv",
+ "fk_constraint_explicit_name",
+ ],
+ )
+ def test_index_naming(self, constraint_type):
+ """test #10920"""
+
+ if (
+ constraint_type.unique_constraint_naming_conv
+ or constraint_type.fk_constraint_naming_conv
+ ):
+ self.Base.metadata.naming_convention = {
+ "ix": "ix_%(column_0_label)s",
+ "uq": "uq_%(table_name)s_%(column_0_name)s",
+ "fk": (
+ "fk_%(table_name)s_%(column_0_name)s"
+ "_%(referred_table_name)s"
+ ),
+ }
+
+ if (
+ constraint_type.fk_constraint
+ or constraint_type.fk_constraint_naming_conv
+ or constraint_type.fk_constraint_explicit_name
+ ):
+
+ class Related(self.Base):
+ __tablename__ = "related"
+
+ id = Column(Integer, primary_key=True)
+
+ class SomeClass(Versioned, self.Base):
+ __tablename__ = "sometable"
+
+ id = Column(Integer, primary_key=True)
+ x = Column(Integer)
+ y = Column(Integer)
+
+ # Index objects are copied and these have to have a new name
+ if constraint_type.index_single_col:
+ __table_args__ = (
+ Index(
+ None,
+ x,
+ ),
+ )
+ elif constraint_type.composite_index:
+ __table_args__ = (Index(None, x, y),)
+ elif constraint_type.explicit_name_index:
+ __table_args__ = (Index("my_index", x, y),)
+ # unique constraint objects are discarded.
+ elif (
+ constraint_type.unique_constraint
+ or constraint_type.unique_constraint_naming_conv
+ ):
+ __table_args__ = (UniqueConstraint(x, y),)
+ elif constraint_type.unique_constraint_explicit_name:
+ __table_args__ = (UniqueConstraint(x, y, name="my_uq"),)
+ # foreign key constraint objects are copied and have the same
+ # name, but no database in Core has any problem with this as the
+ # names are local to the parent table.
+ elif (
+ constraint_type.fk_constraint
+ or constraint_type.fk_constraint_naming_conv
+ ):
+ __table_args__ = (ForeignKeyConstraint([x], [Related.id]),)
+ elif constraint_type.fk_constraint_explicit_name:
+ __table_args__ = (
+ ForeignKeyConstraint([x], [Related.id], name="my_fk"),
+ )
+ else:
+ constraint_type.fail()
+
+ eq_(
+ set(idx.name + "_history" for idx in SomeClass.__table__.indexes),
+ set(
+ idx.name
+ for idx in SomeClass.__history_mapper__.local_table.indexes
+ ),
+ )
+ self.create_tables()
+
def test_discussion_9546(self):
class ThingExternal(Versioned, self.Base):
__tablename__ = "things_external"