I think this may partly illustrate the problem (or am I doing something
silly?):

CREATE SCHEMA content;
CREATE SEQUENCE content.node_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

CREATE TABLE content.node
(
  id int8 NOT NULL DEFAULT nextval('content.node_id_seq'::regclass),
  parent_id int8,
  next_sibling_id int8,
  prev_sibling_id int8,
  CONSTRAINT node_pkey PRIMARY KEY (id),
  CONSTRAINT node_next_sibling_id_fkey FOREIGN KEY (next_sibling_id)
REFERENCES content.node (id) ON UPDATE CASCADE ON DELETE SET NULL,
  CONSTRAINT node_parent_id_fkey FOREIGN KEY (parent_id) REFERENCES
content.node (id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT node_prev_sibling_id_fkey FOREIGN KEY (prev_sibling_id)
REFERENCES content.node (id) ON UPDATE CASCADE ON DELETE SET NULL
)
WITHOUT OIDS;

CREATE SEQUENCE content.tree_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

CREATE TABLE content.tree
(
  id int8 NOT NULL DEFAULT nextval('content.tree_id_seq'::regclass),
  root_id int8,
  context text,
  CONSTRAINT tree_pkey PRIMARY KEY (id),
  CONSTRAINT tree_root_id_fkey FOREIGN KEY (root_id) REFERENCES
content.node (id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT tree_context_key UNIQUE (context)
)
WITHOUT OIDS;

--8<------------------------------------------------------

import sqlalchemy.mods.threadlocal
from sqlalchemy import *

engine = create_engine('postgres://user:[EMAIL PROTECTED]/test', echo=True)
metadata = BoundMetaData(engine)
session = objectstore.session

class Node(object):
    pass

class Tree(object):
    pass

node_table = Table('node', metadata, schema='content', autoload=True)
node_mapper = mapper(Node, node_table, properties={
    'parent': sqlalchemy.relation(
        Node,
        lazy=True,
        primaryjoin=node_table.c.parent_id==node_table.c.id,
        foreignkey=node_table.c.id,
            uselist=False
        ),
        '_children': sqlalchemy.relation(
            Node,
            primaryjoin=node_table.c.id==node_table.c.parent_id,
            lazy=True,
            cascade='all'
        ),
        'previous_sibling': sqlalchemy.relation(
            Node,
            primaryjoin=node_table.c.prev_sibling_id==node_table.c.id,
            foreignkey=node_table.c.id,
            lazy=True,
            uselist=False
        ),
        'next_sibling': sqlalchemy.relation(
            Node,
            primaryjoin=node_table.c.next_sibling_id==node_table.c.id,
            foreignkey=node_table.c.id,
            lazy=True,
            uselist=False,
            post_update=True
        )
})

tree_table = Table('tree', metadata, schema='content', autoload=True)
tree_mapper = mapper(Tree, tree_table)

print session.query(Tree).select_by(context=None)

--8<------------------------------------------------------

Gives this traceback:

Traceback (most recent call last):
  File "test.py", line 50, in ?
    print session.query(Tree).select_by(context=None)
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/session.py", line 180,
in query
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/session.py", line 452,
in class_mapper
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 1426,
in class_mapper
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 166,
in compile
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 184,
in _compile_all
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 403,
in _initialize_properties
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/mapper.py", line 1169,
in init
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/properties.py", line
249, in do_init
  File "build/bdist.linux-i686/egg/sqlalchemy/orm/properties.py", line
302, in _get_direction

Working with Postgres 8.1.4, and SA rev 1869.

Michael Bayer wrote:
> I just noticed this comment thats been sitting on the wiki for a few  
> months:
> 
> If using autoload=True when defining your metadata, be sure your FK  
> constraint names are unique to the schema . PostgreSQL scopes FK  
> constraint names to the table, but SQLAlchemy loads them from the SQL  
> standard information_schema, which is designed for schema-scoped  
> constraint names.
> 
> which is news to me; the query used to reflect foreign keys takes  
> table name into account, and a unit test which reflects anonymously- 
> created foreign keys from two different tables works fine (and always  
> has...).   can someone illustrate this problem for me ? 
>    
> 
> -------------------------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642


-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to