Michael
thanks very much for your helpful advice - the problem seems to
actually involve the autoloading of the table in question.
The table structure is as follows:
CREATE TABLE wcs (
image_id INTEGER NOT NULL,
amp INTEGER NOT NULL,
ctype1 TEXT,
(other column defs deleted)
PRIMARY KEY (image_id, amp),
FOREIGN KEY (image_id, amp) REFERENCES science_amp
ON DELETE NO ACTION
ON UPDATE CASCADE)
and the class definition is as follows:
class Wcs(skymapper_db.db.TableBase):
from sqlalchemy import Table, Column, Integer, String, MetaData,
ForeignKey, ForeignKeyConstraint
from sqlalchemy.orm import relationship, backref
__tablename__ = 'wcs'
__table_args__ = {'autoload':True}
image_id = Column(Integer, primary_key=True)
amp = Column(Integer, primary_key=True)
def __init__(self):
from sqlalchemy import ForeignKeyConstraint
self.__table__.append_constraint(ForeignKeyConstraint(['image_id',
'amp'], ['science_amp.image_id', 'science_amp.amp']))
def __repr__(self):
return "<Wcs(%s, %s)>" % (self.image_id, self.amp)
If I attempt to instantiate the class as defined, I get:
Traceback (most recent call last):
File "C:\Users\jgs900\Work\skymapper-alchemy\wcs.py", line 13, in
<module>
class Wcs(skymapper_db.db.TableBase):
File "C:\Python27\lib\site-packages\sqlalchemy\ext\declarative.py",
line 1017, in __init__
_as_declarative(cls, classname, cls.__dict__)
File "C:\Python27\lib\site-packages\sqlalchemy\ext\declarative.py",
line 926, in _as_declarative
**table_kw)
File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 209,
in __new__
table._init(name, metadata, *args, **kw)
File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 269,
in _init
self._init_items(*args)
File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 60,
in _init_items
item._set_parent(self)
File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 809,
in _set_parent
table.constraints.remove(fk.constraint)
KeyError: ForeignKeyConstraint()
but if I disable the autoloading, there is no problem
PS: sqlalchemy v0.6.3, Python 2.7, PostgreSQL 8.4.1
Thanks again - Jon
On Aug 4, 2:06 pm, Michael Bayer <[email protected]> wrote:
> On Aug 3, 2010, at 10:24 PM, jgs9000 wrote:
>
> > Hi
>
> > I'm relatively new to SQLAlchemy, so thanks in advance for any help
> > with this issue.
>
> > I'm trying to construct a class to model a legacy table which has a
> > composite primary key which is also
> > a composite foreign key referencing the composite primary key of a
> > second table. I'm trying to define this
> > class declaratively, and also have it autoload the remaining table
> > structure from the underlying table.
>
> i dont know that we have any tests which do a pure autoload plus a foreign
> key constraint otherwise not associated with anything. so its likely a bug.
> you might want to try calling table.append_constraint(constraint) after the
> autoload completes.
>
>
>
> > This is what I have:
>
> > class Wcs(skymapper_db.db.TableBase):
>
> > from sqlalchemy import Column, Integer, ForeignKeyConstraint
>
> > __tablename__ = 'wcs'
> > __table_args__ = (
> > ForeignKeyConstraint(['image_id', 'amp'],
> > ['science_amp.image_id', 'science_amp.amp']),
> > {'autoload':True}
> > )
>
> > image_id = Column(Integer, primary_key=True)
> > amp = Column(Integer, primary_key=True)
>
> > def __init__(self):
> > pass
>
> > def __repr__(self):
> > return "<Wcs(%s, %s)>" % (self.image_id, self.amp)
>
> > As it stands, I get an error when I try to instantiate this class:
>
> > C:\Users\jgs900\Work\skymapper-alchemy>wcs.py
> > Traceback (most recent call last):
> > File "C:\Users\jgs900\Work\skymapper-alchemy\wcs.py", line 13, in
> > <module>
> > class Wcs(skymapper_db.db.TableBase):
> > File "C:\Python27\lib\site-packages\sqlalchemy\ext\declarative.py",
> > line 1017, in __init__
> > _as_declarative(cls, classname, cls.__dict__)
> > File "C:\Python27\lib\site-packages\sqlalchemy\ext\declarative.py",
> > line 926, in _as_declarative
> > **table_kw)
> > File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 209,
> > in __new__
> > table._init(name, metadata, *args, **kw)
> > File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 269,
> > in _init
> > self._init_items(*args)
> > File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 60,
> > in _init_items
> > item._set_parent(self)
> > File "C:\Python27\lib\site-packages\sqlalchemy\schema.py", line 809,
> > in _set_parent
> > table.constraints.remove(fk.constraint)
> > KeyError: ForeignKeyConstraint()
>
> > but if I leave out the autoload instruction, there is no problem.
>
> > Am i doing something fundamentally wrong? Or am I just making a syntax
> > error of some sort. Any help
> > would be greatly appreciated.
>
> > --
> > 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
> > athttp://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 [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.