Skip to content
This repository was archived by the owner on Feb 21, 2020. It is now read-only.

Commit a82ff7c

Browse files
committed
reflect identity as autoincrement=True and primary_key=True
and also extract related sequence as Sequence object
1 parent a8a8fa4 commit a82ff7c

1 file changed

Lines changed: 45 additions & 16 deletions

File tree

sqla_vertica_python/vertica_python.py

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,8 @@ def get_columns(self, connection, table_name, schema=None, **kw):
192192
column_name,
193193
data_type,
194194
column_default,
195-
is_nullable
195+
is_nullable,
196+
is_identity
196197
FROM v_catalog.columns
197198
where table_name = '{table_name}'
198199
{schema_conditional}
@@ -201,25 +202,49 @@ def get_columns(self, connection, table_name, schema=None, **kw):
201202
column_name,
202203
data_type,
203204
'' as column_default,
204-
true as is_nullable
205+
true as is_nullable,
206+
false as is_identity
205207
FROM v_catalog.view_columns
206208
where table_name = '{table_name}'
207209
{schema_conditional}
208210
""".format(table_name=table_name, schema_conditional=schema_conditional)
209211
colobjs = []
210-
for row in connection.execute(column_select):
211-
colobj = self._get_column_info(
212-
row.column_name,
213-
row.data_type,
214-
row.is_nullable,
215-
row.column_default,
216-
(row.column_name in primary_key_columns)
217-
)
218-
if colobj:
219-
colobjs.append(colobj)
212+
column_select_results = list(connection.execute(column_select))
213+
for row in column_select_results:
214+
if row.is_identity:
215+
# get sequence info.
216+
seqinfo = connection.execute("""
217+
SELECT
218+
sequence_name as name,
219+
minimum as start,
220+
increment_by as increment
221+
FROM v_catalog.sequences
222+
WHERE identity_table_name = '{table_name}'
223+
{schema_conditional}
224+
""".format(
225+
table_name=table_name,
226+
schema_conditional=(
227+
"" if schema is None
228+
else "AND sequence_schema = '{schema}'".format(schema=schema)
229+
)
230+
)
231+
).fetchone()
232+
else:
233+
seqinfo = None
234+
colobj = self._get_column_info(
235+
row.column_name,
236+
row.data_type,
237+
row.is_nullable,
238+
row.column_default,
239+
row.is_identity,
240+
(row.column_name in primary_key_columns),
241+
seqinfo
242+
)
243+
if colobj:
244+
colobjs.append(colobj)
220245
return colobjs
221246

222-
def _get_column_info(self, name, data_type, is_nullable, default, is_primary_key):
247+
def _get_column_info(self, name, data_type, is_nullable, default, is_identity, is_primary_key, sequence):
223248
m = re.match(r'(\w+)(?:\((\d+)(?:,(\d+))?\))?', data_type)
224249
if not m:
225250
raise ValueError("data type string not parseable for type name and optional parameters: %s" % data_type)
@@ -241,14 +266,18 @@ def _get_column_info(self, name, data_type, is_nullable, default, is_primary_key
241266
if callable(typeobj):
242267
typeobj = typeobj(*typeargs, **typekwargs)
243268

244-
return {
269+
cinfo = {
245270
'name': name,
246271
'type': typeobj,
247272
'nullable': is_nullable,
248273
'default': default,
249-
'primary_key': is_primary_key
274+
'primary_key': (is_primary_key or is_identity)
250275
}
251-
276+
if is_identity:
277+
cinfo['autoincrement'] = True
278+
if sequence:
279+
cinfo['sequence'] = dict(sequence)
280+
return cinfo
252281

253282
@reflection.cache
254283
def get_unique_constraints(self, connection, table_name, schema=None, **kw):

0 commit comments

Comments
 (0)