summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2015-10-06 22:53:54 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2015-10-06 22:53:54 -0400
commit0a34070d9274d3dda05628543560bb42e8588dde (patch)
tree102fc63fd89589e486aed5be260b96a3fa8113b1
parentec0867e9e6397e0c9cc30c79198edb2a5ea2dace (diff)
downloadsqlalchemy-0a34070d9274d3dda05628543560bb42e8588dde.tar.gz
- illustrate / test workaround for FetchedValue
-rw-r--r--doc/build/changelog/migration_11.rst31
-rw-r--r--test/dialect/test_sqlite.py26
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(