On Oct 4, 2011, at 12:17 PM, rdunklau wrote: > Hello. > > I'm having a problem with sqlalchemy and postgresql, and I really > don't know what should I do to correct it. > > I'm using sqlalchemy. 0.7.3 with postgresql 2.7.2, with the psycopg2 > driver and dialect.
I'm not aware of what versioning system "2.7.2" might be a part of, that is not any such version I'm aware of. PG was at version 6 in 1997 and the current version is 9 - the oldest PGs in use would be version 8 or 7 (see http://en.wikipedia.org/wiki/PostgreSQL#Major_releases for a full history). Can you confirm the version of Postgresql in use ? Data catalog errors tend to be version dependent. > > Looking through the logs, I've found that the following query is used > to find primary keys: > > > SELECT attname FROM pg_attribute > WHERE attrelid = ( > SELECT indexrelid FROM pg_index i > WHERE i.indrelid = %(table_oid)s > AND i.indisprimary = 't') > ORDER BY attnum > > I've tried to run this query myself, and the result is 'id', and not > 'product_id'. > While this kind of error has been seen in other areas, currently I'm not able to reproduce - PG has altered how they handle their data catalogs across versions so the exact version of PG here is of key importance. I've also committed the corresponding test for below to the current tip: CREATE TABLE t ( id SERIAL NOT NULL, PRIMARY KEY (id) ) COMMIT alter table t rename id to t_id COMMIT SELECT attname FROM pg_attribute WHERE attrelid = ( SELECT indexrelid FROM pg_index i WHERE i.indrelid = %(table_oid)s AND i.indisprimary = 't') ORDER BY attnum INFO:sqlalchemy.engine.base.Engine:{'table_oid': 11096193} DEBUG:sqlalchemy.engine.base.Engine:Col ('attname',) DEBUG:sqlalchemy.engine.base.Engine:Row (u't_id',) the correct value "t_id" is returned. > Is this a postgresql bug for not updating the attribute name in the > system catalog ? probably > Why did sqlalchemy choose to query the system tables instead of the > information_schema ? we used information_schema many years ago. At least back then, its performance was orders of magnitude slower and it also does not return complete data. > I'm not really sure, but it looks like the system tables are not meant > to be used for this kind of introspection. The information schema views are extremely slow for big reflection jobs. The PG tables also have information on PG specific features, which we need to get at: "The information schema views do not, however, contain information about PostgreSQL-specific features; to inquire about those you need to query the system catalogs or other PostgreSQL-specific views. " Most articles/howtos/help/documentation I've ever seen on the subject use the pg_ tables, some examples: http://crafted-software.blogspot.com/2011/03/get-all-column-names-of-table-in.html http://www.polak.ro/postgresql-select-tables-names.html http://www.alberton.info/postgresql_meta_info.html (illustrates using both INFO_SCHEMA and pg_ tables) I've also analyzed the queries emitted by the pgAdmin3 tool and it uses the pg_ tables. We've had lots of bugs with PG reflection and the system tables have always ultimately had the right information, though sometimes very hard to get at. > Does anyone have any workaround (besides the obvious: remap the table > manually) ? SQLAlchemy can attempt to work around the issue if a known workaround for the PG version in question is present, or alternatively you can provide the primary key column of the Table manually using the technique described at http://www.sqlalchemy.org/docs/core/schema.html#overriding-reflected-columns . > > Thank you. > > -- > Ronan Dunklau > > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalchemy@googlegroups.com. > To unsubscribe from this group, send email to > sqlalchemy+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/sqlalchemy?hl=en. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.