From: Mike Bayer Date: Sat, 20 Sep 2014 18:30:00 +0000 (-0400) Subject: - more tweaks for server defaults re: comparison, test results X-Git-Tag: rel_0_7_0~74 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2b3965b9178fcfd2a61a6d6cf272b9b07367b897;p=thirdparty%2Fsqlalchemy%2Falembic.git - more tweaks for server defaults re: comparison, test results - in particular we've changed the server_default for order.amount to text('0'); SQlite and Postgresql now both report the server default as '0', whereas previously, when we were emitting '0' with the quotes in the CREATE TABLE, SQlite reported it as "'0'" and PG as '0::numeric'. --- diff --git a/alembic/autogenerate/compare.py b/alembic/autogenerate/compare.py index b5af2d89..4b640fcb 100644 --- a/alembic/autogenerate/compare.py +++ b/alembic/autogenerate/compare.py @@ -508,6 +508,7 @@ def _compare_server_default(schema, tname, cname, conn_col, metadata_col, rendered_conn_default = conn_col.server_default.arg.text \ if conn_col.server_default else None + isdiff = autogen_context['context']._compare_server_default( conn_col, metadata_col, rendered_metadata_default, diff --git a/alembic/autogenerate/render.py b/alembic/autogenerate/render.py index 981ee1e7..9fe560a5 100644 --- a/alembic/autogenerate/render.py +++ b/alembic/autogenerate/render.py @@ -359,9 +359,12 @@ def _render_server_default(default, autogen_context, repr_=True): return rendered if isinstance(default, sa_schema.DefaultClause): - default = _render_potential_expr(default.arg, autogen_context) + if isinstance(default.arg, compat.string_types): + default = default.arg + else: + return _render_potential_expr(default.arg, autogen_context) - elif isinstance(default, string_types) and repr_: + if isinstance(default, string_types) and repr_: default = repr(re.sub(r"^'|'$", "", default)) return default diff --git a/alembic/ddl/sqlite.py b/alembic/ddl/sqlite.py index 05d734c8..4341eaff 100644 --- a/alembic/ddl/sqlite.py +++ b/alembic/ddl/sqlite.py @@ -31,9 +31,14 @@ class SQLiteImpl(DefaultImpl): rendered_metadata_default, rendered_inspector_default): - rendered_metadata_default = re.sub( - r"^'|'$", "", rendered_metadata_default) - return rendered_inspector_default != repr(rendered_metadata_default) + if rendered_metadata_default is not None: + rendered_metadata_default = re.sub( + r"^\"'|\"'$", "", rendered_metadata_default) + if rendered_inspector_default is not None: + rendered_inspector_default = re.sub( + r"^\"'|\"'$", "", rendered_inspector_default) + + return rendered_inspector_default != rendered_metadata_default def correct_for_autogen_constraints( self, conn_unique_constraints, conn_indexes, diff --git a/tests/test_autogen_render.py b/tests/test_autogen_render.py index d74e5256..54ace42c 100644 --- a/tests/test_autogen_render.py +++ b/tests/test_autogen_render.py @@ -6,7 +6,7 @@ from sqlalchemy import MetaData, Column, Table, String, \ Numeric, CHAR, ForeignKey, DATETIME, Integer, \ CheckConstraint, Unicode, Enum,\ UniqueConstraint, Boolean, ForeignKeyConstraint,\ - PrimaryKeyConstraint, Index, func, text + PrimaryKeyConstraint, Index, func, text, DefaultClause from sqlalchemy.types import TIMESTAMP from sqlalchemy.dialects import mysql, postgresql @@ -1030,5 +1030,29 @@ class RenderNamingConventionTest(TestBase): 'nullable=False)' ) + def test_render_server_default_int(self): + c = Column( + 'value', Integer, + server_default="0") + result = autogenerate.render._render_column( + c, self.autogen_context + ) + eq_( + result, + "sa.Column('value', sa.Integer(), " + "server_default='0', nullable=True)" + ) + def test_render_modify_reflected_int_server_default(self): + eq_ignore_whitespace( + autogenerate.render._modify_col( + "sometable", "somecolumn", + self.autogen_context, + existing_type=Integer(), + existing_server_default=DefaultClause(text("5")), + nullable=True), + "op.alter_column('sometable', 'somecolumn', " + "existing_type=sa.Integer(), nullable=True, " + "existing_server_default=sa.text('5'))" + ) diff --git a/tests/test_autogenerate.py b/tests/test_autogenerate.py index 8733150c..b2ee6714 100644 --- a/tests/test_autogenerate.py +++ b/tests/test_autogenerate.py @@ -2,10 +2,8 @@ import re import sys from sqlalchemy import MetaData, Column, Table, Integer, String, Text, \ - Numeric, CHAR, ForeignKey, DATETIME, INTEGER, \ - TypeDecorator, CheckConstraint, Unicode, Enum,\ - UniqueConstraint, Boolean, ForeignKeyConstraint,\ - PrimaryKeyConstraint, Index, func + Numeric, CHAR, ForeignKey, INTEGER, \ + TypeDecorator, CheckConstraint, text from sqlalchemy.types import NULLTYPE from sqlalchemy.engine.reflection import Inspector @@ -321,7 +319,7 @@ class ModelOne(object): Table('order', m, Column('order_id', Integer, primary_key=True), Column("amount", Numeric(8, 2), nullable=False, - server_default="0"), + server_default=text("0")), CheckConstraint('amount >= 0', name='ck_order_amount') ) @@ -353,7 +351,7 @@ class ModelOne(object): Table('order', m, Column('order_id', Integer, primary_key=True), Column('amount', Numeric(10, 2), nullable=True, - server_default="0"), + server_default=text("0")), Column('user_id', Integer, ForeignKey('user.id')), CheckConstraint('amount > -1', name='ck_order_amount'), ) @@ -467,7 +465,7 @@ nullable=True)) existing_type=sa.NUMERIC(precision=8, scale=2), type_=sa.Numeric(precision=10, scale=2), nullable=True, - existing_server_default='0') + existing_server_default=sa.text('0')) op.drop_column('user', 'pw') op.alter_column('user', 'a1', existing_type=sa.TEXT(), @@ -493,7 +491,7 @@ nullable=True)) existing_type=sa.Numeric(precision=10, scale=2), type_=sa.NUMERIC(precision=8, scale=2), nullable=False, - existing_server_default='0') + existing_server_default=sa.text('0')) op.drop_column('order', 'user_id') op.drop_column('address', 'street') op.create_table('extra', @@ -742,7 +740,7 @@ schema='%(schema)s') existing_type=sa.NUMERIC(precision=8, scale=2), type_=sa.Numeric(precision=10, scale=2), nullable=True, - existing_server_default='0::numeric', + existing_server_default=sa.text('0'), schema='%(schema)s') op.drop_column('user', 'pw', schema='%(schema)s') op.alter_column('user', 'a1', @@ -773,7 +771,7 @@ autoincrement=False, nullable=True), schema='%(schema)s') existing_type=sa.Numeric(precision=10, scale=2), type_=sa.NUMERIC(precision=8, scale=2), nullable=False, - existing_server_default='0::numeric', + existing_server_default=sa.text('0'), schema='%(schema)s') op.drop_column('order', 'user_id', schema='%(schema)s') op.drop_column('address', 'street', schema='%(schema)s')