@@ -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