summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/postgresql/base.py
diff options
context:
space:
mode:
authorÉric Lemoine <eric.lemoine@gmail.com>2012-09-12 08:55:10 +0200
committerÉric Lemoine <eric.lemoine@gmail.com>2012-09-12 08:55:10 +0200
commit3a1cc85b205e40f891d3c4b07427ca8ddc955a8c (patch)
treeb30adeb8b7ce274ebda24ebc798abcd1c820a811 /lib/sqlalchemy/dialects/postgresql/base.py
parent2bbf09bfdedb2ddc710999f2941bde594d339274 (diff)
downloadsqlalchemy-3a1cc85b205e40f891d3c4b07427ca8ddc955a8c.tar.gz
breaking up PGDialect.get_columns, and add PostGIS column reflection tests
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/base.py')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/base.py211
1 files changed, 109 insertions, 102 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py
index 6070f964f..2c6404fa9 100644
--- a/lib/sqlalchemy/dialects/postgresql/base.py
+++ b/lib/sqlalchemy/dialects/postgresql/base.py
@@ -1481,116 +1481,123 @@ class PGDialect(default.DefaultDialect):
# format columns
columns = []
for name, format_type, default, notnull, attnum, table_oid in rows:
- ## strip (5) from character varying(5), timestamp(5)
- # with time zone, etc
- attype = re.sub(r'\(.*\)', '', format_type)
+ column_info = self._get_column_info(name, format_type, default,
+ notnull, domains, enums, schema)
+ columns.append(column_info)
+ return columns
- # strip '[]' from integer[], etc.
- attype = re.sub(r'\[\]', '', attype)
+ def _get_column_info(self, name, format_type, default,
+ notnull, domains, enums, schema):
+ ## strip (5) from character varying(5), timestamp(5)
+ # with time zone, etc
+ attype = re.sub(r'\(.*\)', '', format_type)
+
+ # strip '[]' from integer[], etc.
+ attype = re.sub(r'\[\]', '', attype)
+
+ nullable = not notnull
+ is_array = format_type.endswith('[]')
+ charlen = re.search('\(([\d,]+)\)', format_type)
+ if charlen:
+ charlen = charlen.group(1)
+ args = re.search('\((.*)\)', format_type)
+ if args:
+ args = tuple(args.group(1).split(','))
+ else:
+ args = ()
+ kwargs = {}
- nullable = not notnull
- is_array = format_type.endswith('[]')
- charlen = re.search('\(([\d,]+)\)', format_type)
+ if attype == 'numeric':
if charlen:
- charlen = charlen.group(1)
- args = re.search('\((.*)\)', format_type)
- if args:
- args = tuple(args.group(1).split(','))
+ prec, scale = charlen.split(',')
+ args = (int(prec), int(scale))
else:
args = ()
- kwargs = {}
-
- if attype == 'numeric':
- if charlen:
- prec, scale = charlen.split(',')
- args = (int(prec), int(scale))
- else:
- args = ()
- elif attype == 'double precision':
- args = (53, )
- elif attype == 'integer':
- args = ()
- elif attype in ('timestamp with time zone',
- 'time with time zone'):
- kwargs['timezone'] = True
- if charlen:
- kwargs['precision'] = int(charlen)
- args = ()
- elif attype in ('timestamp without time zone',
- 'time without time zone', 'time'):
- kwargs['timezone'] = False
- if charlen:
- kwargs['precision'] = int(charlen)
- args = ()
- elif attype == 'bit varying':
- kwargs['varying'] = True
- if charlen:
- args = (int(charlen),)
- else:
- args = ()
- elif attype in ('interval','interval year to month',
- 'interval day to second'):
- if charlen:
- kwargs['precision'] = int(charlen)
- args = ()
- elif charlen:
+ elif attype == 'double precision':
+ args = (53, )
+ elif attype == 'integer':
+ args = ()
+ elif attype in ('timestamp with time zone',
+ 'time with time zone'):
+ kwargs['timezone'] = True
+ if charlen:
+ kwargs['precision'] = int(charlen)
+ args = ()
+ elif attype in ('timestamp without time zone',
+ 'time without time zone', 'time'):
+ kwargs['timezone'] = False
+ if charlen:
+ kwargs['precision'] = int(charlen)
+ args = ()
+ elif attype == 'bit varying':
+ kwargs['varying'] = True
+ if charlen:
args = (int(charlen),)
-
- while True:
- if attype in self.ischema_names:
- coltype = self.ischema_names[attype]
- break
- elif attype in enums:
- enum = enums[attype]
- coltype = ENUM
- if "." in attype:
- kwargs['schema'], kwargs['name'] = attype.split('.')
- else:
- kwargs['name'] = attype
- args = tuple(enum['labels'])
- break
- elif attype in domains:
- domain = domains[attype]
- attype = domain['attype']
- # A table can't override whether the domain is nullable.
- nullable = domain['nullable']
- if domain['default'] and not default:
- # It can, however, override the default
- # value, but can't set it to null.
- default = domain['default']
- continue
+ else:
+ args = ()
+ elif attype in ('interval','interval year to month',
+ 'interval day to second'):
+ if charlen:
+ kwargs['precision'] = int(charlen)
+ args = ()
+ elif charlen:
+ args = (int(charlen),)
+
+ while True:
+ if attype in self.ischema_names:
+ coltype = self.ischema_names[attype]
+ break
+ elif attype in enums:
+ enum = enums[attype]
+ coltype = ENUM
+ if "." in attype:
+ kwargs['schema'], kwargs['name'] = attype.split('.')
else:
- coltype = None
- break
-
- if coltype:
- coltype = coltype(*args, **kwargs)
- if is_array:
- coltype = ARRAY(coltype)
+ kwargs['name'] = attype
+ args = tuple(enum['labels'])
+ break
+ elif attype in domains:
+ domain = domains[attype]
+ attype = domain['attype']
+ # A table can't override whether the domain is nullable.
+ nullable = domain['nullable']
+ if domain['default'] and not default:
+ # It can, however, override the default
+ # value, but can't set it to null.
+ default = domain['default']
+ continue
else:
- util.warn("Did not recognize type '%s' of column '%s'" %
- (attype, name))
- coltype = sqltypes.NULLTYPE
- # adjust the default value
- autoincrement = False
- if default is not None:
- match = re.search(r"""(nextval\(')([^']+)('.*$)""", default)
- if match is not None:
- autoincrement = True
- # the default is related to a Sequence
- sch = schema
- if '.' not in match.group(2) and sch is not None:
- # unconditionally quote the schema name. this could
- # later be enhanced to obey quoting rules /
- # "quote schema"
- default = match.group(1) + \
- ('"%s"' % sch) + '.' + \
- match.group(2) + match.group(3)
-
- column_info = dict(name=name, type=coltype, nullable=nullable,
- default=default, autoincrement=autoincrement)
- columns.append(column_info)
- return columns
+ coltype = None
+ break
+
+ if coltype:
+ coltype = coltype(*args, **kwargs)
+ if is_array:
+ coltype = ARRAY(coltype)
+ else:
+ util.warn("Did not recognize type '%s' of column '%s'" %
+ (attype, name))
+ coltype = sqltypes.NULLTYPE
+ # adjust the default value
+ autoincrement = False
+ if default is not None:
+ match = re.search(r"""(nextval\(')([^']+)('.*$)""", default)
+ if match is not None:
+ autoincrement = True
+ # the default is related to a Sequence
+ sch = schema
+ if '.' not in match.group(2) and sch is not None:
+ # unconditionally quote the schema name. this could
+ # later be enhanced to obey quoting rules /
+ # "quote schema"
+ default = match.group(1) + \
+ ('"%s"' % sch) + '.' + \
+ match.group(2) + match.group(3)
+ print default
+
+ column_info = dict(name=name, type=coltype, nullable=nullable,
+ default=default, autoincrement=autoincrement)
+ return column_info
@reflection.cache
def get_pk_constraint(self, connection, table_name, schema=None, **kw):