Author: ianb
Date: 2004-08-17 22:53:07 -0400 (Tue, 17 Aug 2004)
New Revision: 190
Modified:
trunk/SQLObject/sqlobject/postgres/pgconnection.py
trunk/SQLObject/tests/test.py
Log:
Fixed PG _fromDatabase primary key detection
Modified: trunk/SQLObject/sqlobject/postgres/pgconnection.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/SQLObject/sqlobject/postgres/pgconnection.py 2004-08-18 02:52:3=
6 UTC (rev 189)
+++ trunk/SQLObject/sqlobject/postgres/pgconnection.py 2004-08-18 02:53:0=
7 UTC (rev 190)
@@ -12,8 +12,7 @@
schemes =3D [dbName, 'postgresql', 'psycopg']
=20
def __init__(self, dsn=3DNone, host=3DNone, db=3DNone,
- user=3DNone, passwd=3DNone, autoCommit=3D1,
- usePygresql=3DFalse,
+ user=3DNone, passwd=3DNone, usePygresql=3DFalse,
**kw):
global psycopg, pgdb
if usePygresql:
@@ -25,7 +24,6 @@
import psycopg
self.pgmodule =3D psycopg
=20
- self.autoCommit =3D autoCommit
if dsn is None:
dsn =3D []
if db:
@@ -116,7 +114,7 @@
keyQuery =3D """
SELECT pg_catalog.pg_get_constraintdef(oid) as condef
FROM pg_catalog.pg_constraint r
- WHERE r.conrelid =3D '%s'::regclass AND r.contype =3D 'f'"""
+ WHERE r.conrelid =3D %s::regclass AND r.contype =3D 'f'"""
=20
colQuery =3D """
SELECT a.attname,
@@ -124,22 +122,48 @@
(SELECT substring(d.adsrc for 128) FROM pg_catalog.pg_attrdef d
WHERE d.adrelid=3Da.attrelid AND d.adnum =3D a.attnum)
FROM pg_catalog.pg_attribute a
- WHERE a.attrelid =3D'%s'::regclass
+ WHERE a.attrelid =3D%s::regclass
AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum"""
=20
- keyData =3D self.queryAll(keyQuery % tableName)
- keyRE =3D re.compile("\((.+)\) REFERENCES (.+)\(")
+ primaryKeyQuery =3D """
+ SELECT pg_index.indisprimary,
+ pg_catalog.pg_get_indexdef(pg_index.indexrelid)
+ FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
+ pg_catalog.pg_index AS pg_index
+ WHERE c.relname =3D %s
+ AND c.oid =3D pg_index.indrelid
+ AND pg_index.indexrelid =3D c2.oid
+ AND pg_index.indisprimary
+ """
+
+ keyData =3D self.queryAll(keyQuery % self.sqlrepr(tableName))
+ keyRE =3D re.compile(r"\((.+)\) REFERENCES (.+)\(")
keymap =3D {}
+ =20
for (condef,) in keyData:
match =3D keyRE.search(condef)
if match:
field, reftable =3D match.groups()
keymap[field] =3D reftable.capitalize()
- colData =3D self.queryAll(colQuery % tableName)
+
+ primaryData =3D self.queryAll(primaryKeyQuery % self.sqlrepr(tab=
leName))
+ primaryRE =3D re.compile(r'CREATE .*? USING .* \((.+?)\)')
+ primaryKey =3D None
+ for isPrimary, indexDef in primaryData:
+ match =3D primaryRE.search(indexDef)
+ assert match, "Unparseable contraint definition: %r" % index=
Def
+ assert primaryKey is None, "Already found primary key (%r), =
then found: %r" % (primaryKey, indexDef)
+ primaryKey =3D match.group(1)
+ assert primaryKey, "No primary key found in table %r" % tableNam=
e
+ if primaryKey.startswith('"'):
+ assert primaryKey.endswith('"')
+ primaryKey =3D primaryKey[1:-1]
+
+ colData =3D self.queryAll(colQuery % self.sqlrepr(tableName))
results =3D []
for field, t, notnull, defaultstr in colData:
- if field =3D=3D 'id':
+ if field =3D=3D primaryKey:
continue
colClass, kw =3D self.guessClass(t)
kw['name'] =3D soClass._style.dbColumnToPythonAttr(field)
Modified: trunk/SQLObject/tests/test.py
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/SQLObject/tests/test.py 2004-08-18 02:52:36 UTC (rev 189)
+++ trunk/SQLObject/tests/test.py 2004-08-18 02:53:07 UTC (rev 190)
@@ -639,7 +639,7 @@
=20
postgresCreate =3D """
CREATE TABLE auto_test (
- auto_id SERIAL,
+ auto_id SERIAL PRIMARY KEY,
first_name VARCHAR(100),
last_name VARCHAR(200) NOT NULL,
age INT DEFAULT 0,
|