Hi,

It turns out my example was too hasty. I should have had something like

foobar = Table(
    'foo', meta,
    Column('id',  Integer, nullable=False, primary_key=True),
    )

bar = Table(
    'bar', meta,
Column('id', None, ForeignKey('foo.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False, primary_key=True),
    )

baz = Table(
    'baz', meta,
Column('id', None, ForeignKey('bar.id', onupdate='CASCADE', ondelete='CASCADE'), nullable=False, primary_key=True),
    )

which also gives the same error. Using None type for ForeignKeys here, per the docs. My previous example was using None for a col that was not a ForeignKey.

Also, replacing the type of bar.id with Integer gives the error:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) there is no unique constraint matching given keys for referenced table "bar" '\nCREATE TABLE baz (\n\tid INTEGER NOT NULL, \n\tPRIMARY KEY (id), \n\t FOREIGN KEY(id) REFERENCES bar (id) ON DELETE CASCADE ON UPDATE CASCADE\n)\n\n' {}

which is not very encouraging either. Currently trying to get sqla to emit the SQL for create_all so I can see what it is trying to do.

I added

db.echo = True
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
logging.getLogger('sqlalchemy.orm.unitofwork').setLevel(logging.DEBUG)

but only the

db.echo = True

does something, and that doesn't emit the SQL for creating the tables.

                                                           Regards, Faheem.

On Tue, 27 Jul 2010, Faheem Mitha wrote:


Dear SQLAlchemists,

With the following script, I get the traceback below. This is not the actual example I ran into, but a small test case. To my surprise, I was able to reproduce the identical error almost immediately. In my actual code, I was able to work around this error by doing a table.create() on the first table followed by a create_all, but that doesn't seem to work with my small example.

This is SQLAlchemy 0.5.8-1 running on Debian lenny with python 2.5.2-3, and with PostgreSQL 8.4.2-1~bpo50+1. I'm considering moving to 0.6 but am concerned about breakage.

This seems pretty innocuous. Clarifications appreciated.

                                                       Regards, Faheem.

***********************************************************************
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy import MetaData
meta = MetaData()

foo = Table(
   'foo', meta,
   Column('id',  None, nullable=False, primary_key=True),
   )

bar = Table(
   'bar', meta,
   Column('id',  None, ForeignKey('foo.id', onupdate='CASCADE',
   ondelete='CASCADE'), nullable=False, primary_key=True),
   )

dbuser =
password =
dbname =
dbstring = "postgres://%s:%...@localhost:5432/%s"%(dbuser, password, dbname)
from sqlalchemy import create_engine
db = create_engine(dbstring)
meta.bind = db
meta.create_all()
Session = sessionmaker()
session = Session(bind=db)

**********************************************************
Traceback (most recent call last):
 File "<stdin>", line 23, in <module>
File "/usr/lib/pymodules/python2.5/sqlalchemy/schema.py", line 1811, in create_all
   bind.create(self, checkfirst=checkfirst, tables=tables)
File "/usr/lib/pymodules/python2.5/sqlalchemy/engine/base.py", line 1129, in create self._run_visitor(self.dialect.schemagenerator, entity, connection=connection, **kwargs) File "/usr/lib/pymodules/python2.5/sqlalchemy/engine/base.py", line 1158, in _run_visitor
   visitorcallable(self.dialect, conn, **kwargs).traverse(element)
File "/usr/lib/pymodules/python2.5/sqlalchemy/sql/visitors.py", line 89, in traverse
   return traverse(obj, self.__traverse_options__, self._visitor_dict)
File "/usr/lib/pymodules/python2.5/sqlalchemy/sql/visitors.py", line 200, in traverse
   return traverse_using(iterate(obj, opts), obj, visitors)
File "/usr/lib/pymodules/python2.5/sqlalchemy/sql/visitors.py", line 194, in traverse_using
   meth(target)
File "/usr/lib/pymodules/python2.5/sqlalchemy/sql/compiler.py", line 831, in visit_metadata
   self.traverse_single(table)
File "/usr/lib/pymodules/python2.5/sqlalchemy/sql/visitors.py", line 79, in traverse_single
   return meth(obj)
File "/usr/lib/pymodules/python2.5/sqlalchemy/sql/compiler.py", line 856, in visit_table self.append("\t" + self.get_column_specification(column, first_pk=column.primary_key and not first_pk)) File "/usr/lib/pymodules/python2.5/sqlalchemy/databases/postgres.py", line 849, in get_column_specification
   colspec += " " + column.type.dialect_impl(self.dialect).get_col_spec()
File "/usr/lib/pymodules/python2.5/sqlalchemy/types.py", line 392, in get_col_spec
   raise NotImplementedError()
NotImplementedError


--
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@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.

Reply via email to