code has been broken after upgrade to 0.3.0 from 0.2.x (something with indexes)

Issue #357 resolved
Former user created an issue

The code looks like this (skipping a log of details):

class visit_dim_category(object): pass

...

class schema ...

#somewhere in class schema:

self.visit_dim_category = Table( "visit_dim_category", self.metadata, Column("id",Integer, primary_key=True) ,Column("affiliate", Integer, ForeignKey("affiliate.id")) ,Column("product", Integer, ForeignKey("product.id")) )

Index("visit_dim_category_idx1",self.visit_dim_category.c.affiliate, self.visit_dim_category.c.product, unique=True)

...

visit_dim_category.mapper = mapper(visit_dim_category, self.visit_dim_category)

#creating test db db = create_engine(conf.connection()) schema = schema(db) schema.metadata.drop_all() schema.metadata.create_all()

it works fine in 0.2.7 and 0.2.8 but after updrade to 0.3 this code gives the following errors:

[04:49 ]cff@joy:~/work/stats3/server/test# ./test_db.py create test schema... mysql://root:root@localhost/stat3 Traceback (most recent call last): File "./test_db.py", line 15, in ? schema.metadata.create_all() File "build/bdist.linux-i686/egg/sqlalchemy/schema.py", line 862, in create_all File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 413, in create File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 437, in _run_visitor File "build/bdist.linux-i686/egg/sqlalchemy/schema.py", line 882, in accept_schema_visitor File "build/bdist.linux-i686/egg/sqlalchemy/ansisql.py", line 637, in visit_metadata File "build/bdist.linux-i686/egg/sqlalchemy/schema.py", line 268, in accept_schema_visitor File "build/bdist.linux-i686/egg/sqlalchemy/ansisql.py", line 671, in visit_table File "build/bdist.linux-i686/egg/sqlalchemy/schema.py", line 819, in accept_schema_visitor File "build/bdist.linux-i686/egg/sqlalchemy/ansisql.py", line 749, in visit_index File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 763, in execute File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 365, in proxy File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 329, in _execute_raw File "build/bdist.linux-i686/egg/sqlalchemy/engine/base.py", line 348, in _execute sqlalchemy.exceptions.SQLError: (OperationalError) (1061, "Duplicate key name 'visit_dim_category_idx1'") 'CREATE UNIQUE INDEX visit_dim_category_idx1 ON visit_dim_category (affiliate, product)' ()

Comments (2)

  1. Mike Bayer repo owner

    its very likely you have simply created the same Index object twice in your code. version 0.3 no longer stores Indexes in a name-based dictionary attached to tables, and instead stores them in a simple set.

    heres a test program which i created based on the fragments you gave (please read new ticket guidelines! creating fully working test cases is as much to encourage the end-user to fully understand their problem as much as it is for me to not have to guess how their program worked.)

    from sqlalchemy import *
    e = create_engine('postgres://scott:tiger@127.0.0.1/test', echo=True)
    metadata = BoundMetaData(e)
    table = Table( "visit_dim_category", metadata,
    
        Column("id",Integer, primary_key=True) ,Column("affiliate", Integer) ,Column("product", Integer)
    )
    
    Index("visit_dim_category_idx1",table.c.affiliate, table.c.product, unique=True)
    
    metadata.drop_all()
    metadata.create_all()
    

    heres the output (on a subsequent run, so 'visit_dim_category' already existed):

    2006-10-31 13:32:22,838 INFO sqlalchemy.engine.base.Engine.0x..d0 select relname from pg_class where lower(relname) = %(name)s
    2006-10-31 13:32:22,840 INFO sqlalchemy.engine.base.Engine.0x..d0 {'name': 'visit_dim_category'}
    2006-10-31 13:32:23,313 INFO sqlalchemy.engine.base.Engine.0x..d0 
    DROP TABLE visit_dim_category
    2006-10-31 13:32:23,314 INFO sqlalchemy.engine.base.Engine.0x..d0 None
    2006-10-31 13:32:23,491 INFO sqlalchemy.engine.base.Engine.0x..d0 COMMIT
    2006-10-31 13:32:23,498 INFO sqlalchemy.engine.base.Engine.0x..d0 select relname from pg_class where lower(relname) = %(name)s
    2006-10-31 13:32:23,500 INFO sqlalchemy.engine.base.Engine.0x..d0 {'name': 'visit_dim_category'}
    2006-10-31 13:32:23,649 INFO sqlalchemy.engine.base.Engine.0x..d0 
    CREATE TABLE visit_dim_category (
            id SERIAL NOT NULL, 
            affiliate INTEGER, 
            product INTEGER, 
            PRIMARY KEY (id)
    )
    
    
    2006-10-31 13:32:23,651 INFO sqlalchemy.engine.base.Engine.0x..d0 None
    2006-10-31 13:32:23,675 INFO sqlalchemy.engine.base.Engine.0x..d0 COMMIT
    2006-10-31 13:32:23,680 INFO sqlalchemy.engine.base.Engine.0x..d0 CREATE UNIQUE INDEX visit_dim_category_idx1 ON visit_dim_category (affiliate, product)
    2006-10-31 13:32:23,681 INFO sqlalchemy.engine.base.Engine.0x..d0 None
    2006-10-31 13:32:23,687 INFO sqlalchemy.engine.base.Engine.0x..d0 COMMIT
    
  2. Log in to comment