]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- add a note how to generate pg10 IDENTITY for now
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 9 Oct 2017 15:12:34 +0000 (11:12 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 9 Oct 2017 15:12:50 +0000 (11:12 -0400)
Change-Id: I22dbf6ba322904a80c6df46f6a31daa2fcc1f946
(cherry picked from commit 2b2cdee7994d4af8dbd3dab28a5588c02e974fc8)

lib/sqlalchemy/dialects/postgresql/base.py

index 01bb161287b43dcbce6e2c24051b4937435f7d8c..e5f164d57317b613417b5aaeaa0429346f49014f 100644 (file)
@@ -11,8 +11,8 @@ r"""
 
 .. _postgresql_sequences:
 
-Sequences/SERIAL
-----------------
+Sequences/SERIAL/IDENTITY
+-------------------------
 
 PostgreSQL supports sequences, and SQLAlchemy uses these as the default means
 of creating new primary key values for integer-based primary key columns. When
@@ -43,6 +43,40 @@ case.
 To force the usage of RETURNING by default off, specify the flag
 ``implicit_returning=False`` to :func:`.create_engine`.
 
+Postgresql 10 IDENTITY columns
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Postgresql 10 has a new IDENTITY feature that supersedes the use of SERIAL.
+Built-in support for rendering of IDENTITY is not available yet, however the
+following compilation hook may be used to replace occurrences of SERIAL with
+IDENTITY::
+
+    from sqlalchemy.schema import CreateColumn
+    from sqlalchemy.ext.compiler import compiles
+
+
+    @compiles(CreateColumn, 'postgresql')
+    def use_identity(element, compiler, **kw):
+        text = compiler.visit_create_column(element, **kw)
+        text = text.replace("SERIAL", "INT GENERATED BY DEFAULT AS IDENTITY")
+        return text
+
+Using the above, a table such as::
+
+    t = Table(
+        't', m,
+        Column('id', Integer, primary_key=True),
+        Column('data', String)
+    )
+
+Will generate on the backing database as::
+
+    CREATE TABLE t (
+        id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
+        data VARCHAR,
+        PRIMARY KEY (id)
+    )
+
 .. _postgresql_isolation_level:
 
 Transaction Isolation Level