Skip to content

Commit 0b58124

Browse files
committed
Fixed missing server_default in primary key columns
Fixed server defaults being expressed as string literals
1 parent 29561b9 commit 0b58124

2 files changed

Lines changed: 29 additions & 6 deletions

File tree

sqlacodegen/codegen.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
import sqlalchemy
1616

1717
try:
18-
from sqlalchemy.sql.expression import TextClause
18+
from sqlalchemy.sql.expression import text, TextClause
1919
except ImportError:
2020
# SQLAlchemy < 0.8
21-
from sqlalchemy.sql.expression import _TextClause as TextClause
21+
from sqlalchemy.sql.expression import text, _TextClause as TextClause
2222

2323

2424
_re_boolean_check_constraint = re.compile(r"(?:(?:.*?)\.)?(.*?) IN \(0, 1\)")
@@ -134,16 +134,16 @@ def _render_column(column, show_name):
134134
elif has_index:
135135
column.index = True
136136
kwarg.append('index')
137-
if column.server_default and not is_sole_pk:
138-
column.server_default = _get_compiled_expression(column.server_default.arg)
139-
kwarg.append('server_default')
140137

141138
return 'Column({0})'.format(', '.join(
142139
([repr(column.name)] if show_name else []) +
143140
([_render_column_type(column.type)] if render_coltype else []) +
144141
[_render_constraint(x) for x in dedicated_fks] +
145142
[repr(x) for x in column.constraints] +
146-
['{0}={1}'.format(k, repr(getattr(column, k))) for k in kwarg]))
143+
['{0}={1}'.format(k, repr(getattr(column, k))) for k in kwarg] +
144+
(['server_default=text("{0}")'.format(_get_compiled_expression(column.server_default.arg))] if
145+
column.server_default else [])
146+
))
147147

148148

149149
def _render_constraint(constraint):

test/test_codegen.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from sqlalchemy.engine import create_engine
77
from sqlalchemy.schema import (MetaData, Table, Column, CheckConstraint, UniqueConstraint, Index, ForeignKey,
88
ForeignKeyConstraint)
9+
from sqlalchemy.sql.expression import text
910
from sqlalchemy.types import INTEGER, SMALLINT, VARCHAR, NUMERIC
1011
from sqlalchemy.dialects.postgresql.base import BIGINT, DOUBLE_PRECISION, BOOLEAN, ENUM
1112
from sqlalchemy.dialects.mysql.base import TINYINT
@@ -959,3 +960,25 @@ class OtherItem(Base):
959960
960961
id = Column(Integer, primary_key=True)
961962
"""
963+
964+
def test_pk_default(self):
965+
Table(
966+
'simple_items', self.metadata,
967+
Column('id', INTEGER, primary_key=True, server_default=text('uuid_generate_v4()'))
968+
)
969+
970+
assert self.generate_code() == """\
971+
# coding: utf-8
972+
from sqlalchemy import Column, Integer
973+
from sqlalchemy.ext.declarative import declarative_base
974+
975+
976+
Base = declarative_base()
977+
metadata = Base.metadata
978+
979+
980+
class SimpleItem(Base):
981+
__tablename__ = 'simple_items'
982+
983+
id = Column(Integer, primary_key=True, server_default=text("uuid_generate_v4()"))
984+
"""

0 commit comments

Comments
 (0)