]> git.ipfire.org Git - thirdparty/sqlalchemy/alembic.git/commitdiff
- more tweaks for server defaults re: comparison, test results
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 20 Sep 2014 18:30:00 +0000 (14:30 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 20 Sep 2014 18:37:01 +0000 (14:37 -0400)
- 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'.

alembic/autogenerate/compare.py
alembic/autogenerate/render.py
alembic/ddl/sqlite.py
tests/test_autogen_render.py
tests/test_autogenerate.py

index b5af2d89b8227e1fb0c30bb0f2ac31e151608cc0..4b640fcb72b002b31c7be4172157443e0615471d 100644 (file)
@@ -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,
index 981ee1e7ddd2ed427445eb7d881a5edf716d042b..9fe560a5c6ba19d421e95df97b54005c5d3f5f1f 100644 (file)
@@ -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
index 05d734c8b2da81628e973d683aa902660ef466f6..4341eaffb738e11b54c2dff87f366784fa6d7df8 100644 (file)
@@ -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,
index d74e52568e0b9e7fbefe35a6f3889d225d4ca5a0..54ace42c0d4e4dd0e9f806ba3b34f3c046823ff4 100644 (file)
@@ -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'))"
+        )
 
index 8733150c8b794de6c6fee861099ad6a33a5a38ad..b2ee6714af9ddea3e2cf307dadbf33641ebe99ff 100644 (file)
@@ -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')