--- /dev/null
+.. change::
+ :tags: bug, postgresql
+ :tickets: 5158
+
+ Fixed issue where the "schema_translate_map" feature would not work with a
+ PostgreSQL native enumeration type (i.e. :class:`.Enum`,
+ :class:`.postgresql.ENUM`) in that while the "CREATE TYPE" statement would
+ be emitted with the correct schema, the schema would not be rendered in
+ the CREATE TABLE statement at the point at which the enumeration was
+ referenced.
+
colspec += " SERIAL"
else:
colspec += " " + self.dialect.type_compiler.process(
- column.type, type_expression=column
+ column.type,
+ type_expression=column,
+ identifier_preparer=self.preparer,
)
default = self.get_column_default_string(column)
if default is not None:
else:
return self.visit_ENUM(type_, **kw)
- def visit_ENUM(self, type_, **kw):
- return self.dialect.identifier_preparer.format_type(type_)
+ def visit_ENUM(self, type_, identifier_preparer=None, **kw):
+ if identifier_preparer is None:
+ identifier_preparer = self.dialect.identifier_preparer
+
+ return identifier_preparer.format_type(type_)
def visit_TIMESTAMP(self, type_, **kw):
return "TIMESTAMP%s %s" % (
schema_translate_map=schema_translate_map,
)
+ def test_create_table_with_schema_type_schema_translate(self):
+ e1 = Enum("x", "y", "z", name="somename")
+ e2 = Enum("x", "y", "z", name="somename", schema="someschema")
+ schema_translate_map = {None: "foo", "someschema": "bar"}
+
+ table = Table(
+ "some_table", MetaData(), Column("q", e1), Column("p", e2)
+ )
+ from sqlalchemy.schema import CreateTable
+
+ self.assert_compile(
+ CreateTable(table),
+ "CREATE TABLE foo.some_table (q foo.somename, p bar.somename)",
+ schema_translate_map=schema_translate_map,
+ )
+
def test_create_table_with_tablespace(self):
m = MetaData()
tbl = Table(
[(1, "two"), (2, "three"), (3, "three")],
)
+ @testing.combinations(None, "foo")
+ def test_create_table_schema_translate_map(self, symbol_name):
+ # note we can't use the fixture here because it will not drop
+ # from the correct schema
+ metadata = MetaData()
+
+ t1 = Table(
+ "table",
+ metadata,
+ Column("id", Integer, primary_key=True),
+ Column(
+ "value",
+ Enum(
+ "one",
+ "two",
+ "three",
+ name="schema_enum",
+ schema=symbol_name,
+ ),
+ ),
+ schema=symbol_name,
+ )
+ with testing.db.connect() as conn:
+ conn = conn.execution_options(
+ schema_translate_map={symbol_name: testing.config.test_schema}
+ )
+ t1.create(conn)
+ assert "schema_enum" in [
+ e["name"]
+ for e in inspect(conn).get_enums(
+ schema=testing.config.test_schema
+ )
+ ]
+ t1.create(conn, checkfirst=True)
+
+ conn.execute(t1.insert(), value="two")
+ conn.execute(t1.insert(), value="three")
+ conn.execute(t1.insert(), value="three")
+ eq_(
+ conn.execute(t1.select().order_by(t1.c.id)).fetchall(),
+ [(1, "two"), (2, "three"), (3, "three")],
+ )
+
+ t1.drop(conn)
+ assert "schema_enum" not in [
+ e["name"]
+ for e in inspect(conn).get_enums(
+ schema=testing.config.test_schema
+ )
+ ]
+ t1.drop(conn, checkfirst=True)
+
def test_name_required(self):
metadata = MetaData(testing.db)
etype = Enum("four", "five", "six", metadata=metadata)