- changed milestone to 0.6.4
- changed title to need deterministic + unique algorithm for ix_<name>
need deterministic + unique algorithm for ix_<name>
Issue #1855
resolved
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)
-
repo owner -
repo owner - changed status to resolved
OK that whole fix has gotten through the tests and is in dabe38bf56dd18876466f07667c386c56ba88de4.
-
Account Deleted Thanks a lot!
-
repo owner - removed milestone
Removing milestone: 0.6.4 (automated comment)
- Log in to comment
its not at all appropriate for a counter of any kind to be used there since its not deterministic, and we need to re-generate the same name on the drop side. that function is only used for indexes so we would just need a unique hashing function.