diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-10-06 22:53:54 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2015-10-06 22:53:54 -0400 |
commit | 0a34070d9274d3dda05628543560bb42e8588dde (patch) | |
tree | 102fc63fd89589e486aed5be260b96a3fa8113b1 | |
parent | ec0867e9e6397e0c9cc30c79198edb2a5ea2dace (diff) | |
download | sqlalchemy-0a34070d9274d3dda05628543560bb42e8588dde.tar.gz |
- illustrate / test workaround for FetchedValue
-rw-r--r-- | doc/build/changelog/migration_11.rst | 31 | ||||
-rw-r--r-- | test/dialect/test_sqlite.py | 26 |
2 files changed, 55 insertions, 2 deletions
diff --git a/doc/build/changelog/migration_11.rst b/doc/build/changelog/migration_11.rst index 87a4d83e9..56fb5cff6 100644 --- a/doc/build/changelog/migration_11.rst +++ b/doc/build/changelog/migration_11.rst @@ -303,7 +303,36 @@ semantics unless a column is marked explcitly with ``autoincrement=True``:: In order to anticipate some potential backwards-incompatible scenarios, the :meth:`.Table.insert` construct will perform more thorough checks for missing primary key values on composite primary key columns that don't -have autoincrement set up. +have autoincrement set up; given a table such as:: + + Table( + 'b', metadata, + Column('x', Integer, primary_key=True), + Column('y', Integer, primary_key=True) + ) + +An INSERT emitted with no values for this table will produce the exception:: + + CompileError: Column 'b.x' is marked as a member of the primary + key for table 'b', but has no Python-side or server-side default + generator indicated, nor does it indicate 'autoincrement=True', + and no explicit value is passed. Primary key columns may not + store NULL. Note that as of SQLAlchemy 1.1, 'autoincrement=True' + must be indicated explicitly for composite (e.g. multicolumn) + primary keys if AUTO_INCREMENT/SERIAL/IDENTITY behavior is + expected for one of the columns in the primary key. CREATE TABLE + statements are impacted by this change as well on most backends. + +For a column that is receiving primary key values from a server-side +default or something less common such as a trigger, the presence of a +value generator can be indicated using :class:`.FetchedValue`:: + + Table( + 'b', metadata, + Column('x', Integer, primary_key=True, server_default=FetchedValue()), + Column('y', Integer, primary_key=True, server_default=FetchedValue()) + ) + .. seealso:: diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index 48bacd57e..33903ff89 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -20,7 +20,7 @@ from sqlalchemy.engine.url import make_url from sqlalchemy.testing import fixtures, AssertsCompiledSQL, \ AssertsExecutionResults, engines from sqlalchemy import testing -from sqlalchemy.schema import CreateTable +from sqlalchemy.schema import CreateTable, FetchedValue from sqlalchemy.engine.reflection import Inspector from sqlalchemy.testing import mock @@ -763,6 +763,7 @@ class SQLTest(fixtures.TestBase, AssertsCompiledSQL): CreateTable(t).compile, dialect=sqlite.dialect() ) + class InsertTest(fixtures.TestBase, AssertsExecutionResults): """Tests inserts and autoincrement.""" @@ -791,6 +792,7 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk2(self): + # now raises CompileError due to [ticket:3216] assert_raises( exc.CompileError, self._test_empty_insert, Table( @@ -799,7 +801,19 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): Column('y', Integer, primary_key=True))) @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') + def test_empty_insert_pk2_fv(self): + assert_raises( + exc.DBAPIError, self._test_empty_insert, + Table( + 'b', MetaData(testing.db), + Column('x', Integer, primary_key=True, + server_default=FetchedValue()), + Column('y', Integer, primary_key=True, + server_default=FetchedValue()))) + + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk3(self): + # now raises CompileError due to [ticket:3216] assert_raises( exc.CompileError, self._test_empty_insert, Table( @@ -808,6 +822,16 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): Column('y', Integer, DefaultClause('123'), primary_key=True))) @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') + def test_empty_insert_pk3_fv(self): + assert_raises( + exc.DBAPIError, self._test_empty_insert, + Table( + 'c', MetaData(testing.db), + Column('x', Integer, primary_key=True, + server_default=FetchedValue()), + Column('y', Integer, DefaultClause('123'), primary_key=True))) + + @testing.exclude('sqlite', '<', (3, 3, 8), 'no database support') def test_empty_insert_pk4(self): self._test_empty_insert( Table( |