need deterministic + unique algorithm for ix_<name>

Issue #1855 resolved
Former user created an issue

Code:

from sqlalchemy.schema import (MetaData, Table, Column)
from sqlalchemy import String
from sqlalchemy import create_engine


metadata = MetaData()

tbl_numbers = Table('TBL_LONG_NUMBERS', metadata,
        Column('NUMBER_ID', String(16), primary_key=True),
        Column('NUMBER_VALUE', String(64), index=True),
        Column('NUMBER_RESULT', String(16), index=True)
)

dsn = "oracle://user:password@ip/sid"

engine = create_engine(dsn)
metadata.bind = engine


metadata.create_all()

Traceback:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\sche
ma.py", line 2013, in create_all
    bind.create(self, checkfirst=checkfirst, tables=tables)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1647, in create
    connection=connection, **kwargs)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1682, in _run_visitor
    **kwargs).traverse_single(element)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\sql\
visitors.py", line 77, in traverse_single
    return meth(obj, **kw)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\ddl.py", line 42, in visit_metadata
    self.traverse_single(table, create_ok=True)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\sql\
visitors.py", line 77, in traverse_single
    return meth(obj, **kw)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\ddl.py", line 62, in visit_table
    self.traverse_single(index)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\sql\
visitors.py", line 77, in traverse_single
    return meth(obj, **kw)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\ddl.py", line 76, in visit_index
    self.connection.execute(schema.CreateIndex(index))
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1157, in execute
    params)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1210, in _execute_ddl
    return self.__execute_context(context)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1268, in __execute_context
    context.parameters[0](0), context=context)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1367, in _cursor_execute
    context)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\base.py", line 1360, in _cursor_execute
    context)
  File "c:\python26\lib\site-packages\sqlalchemy-0.6.3-py2.6.egg\sqlalchemy\engi
ne\default.py", line 288, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.DatabaseError: (DatabaseError) ORA-00955: name is already used by
 an existing object
 'CREATE INDEX "ix_TBL_LONG_NUMBERS_NUM_1" ON "TBL_LONG_NUMBERS" ("NUMBER_RESU
LT")' {}

Reason (from compiler.py):

    def _validate_identifier(self, ident, truncate):
        if truncate:
            if len(ident) > self.dialect.max_identifier_length:
                counter = getattr(self, 'counter', 0)
                self.counter = counter + 1
                return ident[- 6](0:self.dialect.max_identifier_length) + "_" + hex(self.counter)[2:](2:)
            else:
                return ident
        else:
            self.dialect.validate_identifier(ident)
            return ident

self is always a new object - so counter is always zero...

Comments (4)

  1. Log in to comment