It is common (for us) to have tables with an identity column and that
column *not* be the primary key. I am dealing with this by querying
the system catalogs and caching the result within the table meta-data
object itself (probably a bad idea but doing it for expediency). The
system catalog query returns -- of course -- the database-level
identifier for the column with the identity property set. How do I
find out if the insert parameters have a value for the identity
column? I am using something like this which has a very evil look to
it:

 if identity_column in [t.c[key].name for key in
self.compiled_parameters[0]]:


pjjH


        if self.compiled.isinsert:
            self.logger.debug('pre_exec for an
INSERT')
            t = self.compiled.statement.table
           if self._table_identity_column(t) is not None:
                self.HAS_IDENTITY = True
                # This returns the database-level name of the column
                # Since the parameters may have different names (this
                # will happen if a named parameter, 'key', was passed
                # to the Column constructor), we need to project out
the names
                identity_column = self._table_identity_column(t)
                self.logger.debug([t.c[key].name for key in
self.compiled_parameters[0]])
                if identity_column in [t.c[key].name for key in
self.compiled_parameters[0]]:
                    self.IDENTITY_INSERT = True
                    self.logger.debug('setting IDENTITY_INSERT ON FOR
%s' % (t))

# detect if the table has an identity column by direct query against
the system catalogs
   def _table_identity_column(self, t):
        """Return the name of the this table's identity column"""
        # negative caching

        if not hasattr(t, '_identity_column'):
            t._identity_column = None
            s = sql.select([syscolumns.c.name],
from_obj=syscolumns.join(sysobjects))
            s = s.where(sql.and_(sysobjects.c.name == t.name, sql.text
("(status & 128 = 128)")))
            r = self.connection.execute(s).fetchone()
            if r is not None:
                t._identity_column  = r[0]
        return t._identity_column

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to