[Sqlalchemy-commits] [4870] sqlalchemy/branches/rel_0_4: - The index name generated when you say "i
Brought to you by:
zzzeek
From: <co...@sq...> - 2008-06-22 17:44:37
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[4870] sqlalchemy/branches/rel_0_4: - The index name generated when you say "index=True"</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>4870</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2008-06-22 13:44:35 -0400 (Sun, 22 Jun 2008)</dd> </dl> <h3>Log Message</h3> <pre>- The index name generated when you say "index=True" on a Column is truncated to the length appropriate for the dialect. Additionally, an Index with a too- long name cannot be explicitly dropped with Index.drop(), similar to [ticket:571]. [ticket:820]</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesrel_0_4CHANGES">sqlalchemy/branches/rel_0_4/CHANGES</a></li> <li><a href="#sqlalchemybranchesrel_0_4libsqlalchemydatabasesaccesspy">sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/access.py</a></li> <li><a href="#sqlalchemybranchesrel_0_4libsqlalchemydatabasesmssqlpy">sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mssql.py</a></li> <li><a href="#sqlalchemybranchesrel_0_4libsqlalchemydatabasesmysqlpy">sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mysql.py</a></li> <li><a href="#sqlalchemybranchesrel_0_4libsqlalchemydatabasespostgrespy">sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemybranchesrel_0_4libsqlalchemydatabasessybasepy">sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/sybase.py</a></li> <li><a href="#sqlalchemybranchesrel_0_4libsqlalchemysqlcompilerpy">sqlalchemy/branches/rel_0_4/lib/sqlalchemy/sql/compiler.py</a></li> <li><a href="#sqlalchemybranchesrel_0_4testsqlconstraintspy">sqlalchemy/branches/rel_0_4/test/sql/constraints.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesrel_0_4CHANGES"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/CHANGES (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/CHANGES 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/CHANGES 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -38,6 +38,13 @@ </span><span class="cx"> looking for the name within the DB's catalog tables. </span><span class="cx"> [ticket:571] </span><span class="cx"> </span><ins>+ - The index name generated when you say "index=True" + on a Column is truncated to the length appropriate + for the dialect. Additionally, an Index with a too- + long name cannot be explicitly dropped with + Index.drop(), similar to [ticket:571]. + [ticket:820] + </ins><span class="cx"> - postgres </span><span class="cx"> - Repaired server_side_cursors to properly detect </span><span class="cx"> text() clauses. </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4libsqlalchemydatabasesaccesspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/access.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/access.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/access.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -408,7 +408,8 @@ </span><span class="cx"> </span><span class="cx"> class AccessSchemaDropper(compiler.SchemaDropper): </span><span class="cx"> def visit_index(self, index): </span><del>- self.append("\nDROP INDEX [%s].[%s]" % (index.table.name, index.name)) </del><ins>+ + self.append("\nDROP INDEX [%s].[%s]" % (index.table.name, self._validate_identifier(index.name, False))) </ins><span class="cx"> self.execute() </span><span class="cx"> </span><span class="cx"> class AccessDefaultRunner(base.DefaultRunner): </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4libsqlalchemydatabasesmssqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mssql.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mssql.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mssql.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -1030,7 +1030,7 @@ </span><span class="cx"> def visit_index(self, index): </span><span class="cx"> self.append("\nDROP INDEX %s.%s" % ( </span><span class="cx"> self.preparer.quote_identifier(index.table.name), </span><del>- self.preparer.quote_identifier(index.name) </del><ins>+ self.preparer.quote(index, self._validate_identifier(index.name, False)) </ins><span class="cx"> )) </span><span class="cx"> self.execute() </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4libsqlalchemydatabasesmysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mysql.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mysql.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/mysql.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -2064,7 +2064,7 @@ </span><span class="cx"> class MySQLSchemaDropper(compiler.SchemaDropper): </span><span class="cx"> def visit_index(self, index): </span><span class="cx"> self.append("\nDROP INDEX %s ON %s" % </span><del>- (self.preparer.format_index(index), </del><ins>+ (self.preparer.quote(index, self._validate_identifier(index.name, False)), </ins><span class="cx"> self.preparer.format_table(index.table))) </span><span class="cx"> self.execute() </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4libsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/postgres.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/postgres.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/postgres.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -747,7 +747,7 @@ </span><span class="cx"> if index.unique: </span><span class="cx"> self.append("UNIQUE ") </span><span class="cx"> self.append("INDEX %s ON %s (%s)" \ </span><del>- % (preparer.format_index(index), </del><ins>+ % (preparer.quote(index, self._validate_identifier(index.name, True)), </ins><span class="cx"> preparer.format_table(index.table), </span><span class="cx"> string.join([preparer.format_column(c) for c in index.columns], ', '))) </span><span class="cx"> whereclause = index.kwargs.get('postgres_where', None) </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4libsqlalchemydatabasessybasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/sybase.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/sybase.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/lib/sqlalchemy/databases/sybase.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -844,7 +844,7 @@ </span><span class="cx"> def visit_index(self, index): </span><span class="cx"> self.append("\nDROP INDEX %s.%s" % ( </span><span class="cx"> self.preparer.quote_identifier(index.table.name), </span><del>- self.preparer.quote_identifier(index.name) </del><ins>+ self.preparer.quote(index, self._validate_identifier(index.name, False)) </ins><span class="cx"> )) </span><span class="cx"> self.execute() </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4libsqlalchemysqlcompilerpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/lib/sqlalchemy/sql/compiler.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/lib/sqlalchemy/sql/compiler.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/lib/sqlalchemy/sql/compiler.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -741,6 +741,19 @@ </span><span class="cx"> findalterables.traverse(c) </span><span class="cx"> return alterables </span><span class="cx"> </span><ins>+ 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[0:self.dialect.max_identifier_length - 6] + "_" + hex(self.counter)[2:] + else: + return ident + else: + self.dialect.validate_identifier(ident) + return ident + + </ins><span class="cx"> class SchemaGenerator(DDLBase): </span><span class="cx"> def __init__(self, dialect, connection, checkfirst=False, tables=None, **kwargs): </span><span class="cx"> super(SchemaGenerator, self).__init__(connection, **kwargs) </span><span class="lines">@@ -900,7 +913,7 @@ </span><span class="cx"> if index.unique: </span><span class="cx"> self.append("UNIQUE ") </span><span class="cx"> self.append("INDEX %s ON %s (%s)" \ </span><del>- % (preparer.format_index(index), </del><ins>+ % (preparer.quote(index, self._validate_identifier(index.name, True)), </ins><span class="cx"> preparer.format_table(index.table), </span><span class="cx"> string.join([preparer.quote(c, c.name) for c in index.columns], ', '))) </span><span class="cx"> self.execute() </span><span class="lines">@@ -929,7 +942,7 @@ </span><span class="cx"> return not self.checkfirst or self.dialect.has_table(self.connection, table.name, schema=table.schema) </span><span class="cx"> </span><span class="cx"> def visit_index(self, index): </span><del>- self.append("\nDROP INDEX " + self.preparer.format_index(index)) </del><ins>+ self.append("\nDROP INDEX " + self.preparer.quote(index, self._validate_identifier(index.name, False))) </ins><span class="cx"> self.execute() </span><span class="cx"> </span><span class="cx"> def drop_foreignkey(self, constraint): </span><span class="lines">@@ -1050,9 +1063,6 @@ </span><span class="cx"> def format_constraint(self, constraint): </span><span class="cx"> return self.quote(constraint, constraint.name) </span><span class="cx"> </span><del>- def format_index(self, index): - return self.quote(index, index.name) - </del><span class="cx"> def format_table(self, table, use_schema=True, name=None): </span><span class="cx"> """Prepare a quoted table and schema name.""" </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesrel_0_4testsqlconstraintspy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/rel_0_4/test/sql/constraints.py (4869 => 4870)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/rel_0_4/test/sql/constraints.py 2008-06-22 16:56:16 UTC (rev 4869) +++ sqlalchemy/branches/rel_0_4/test/sql/constraints.py 2008-06-22 17:44:35 UTC (rev 4870) </span><span class="lines">@@ -201,7 +201,25 @@ </span><span class="cx"> winner='sweden') </span><span class="cx"> ss = events.select().execute().fetchall() </span><span class="cx"> </span><ins>+ def test_too_long_idx_name(self): + dialect = testing.db.dialect.__class__() + dialect.max_identifier_length = 20 </ins><span class="cx"> </span><ins>+ schemagen = dialect.schemagenerator(dialect, None) + schemagen.execute = lambda : None + + t1 = Table("sometable", MetaData(), Column("foo", Integer)) + schemagen.visit_index(Index("this_name_is_too_long_for_what_were_doing", t1.c.foo)) + self.assertEquals(schemagen.buffer.getvalue(), "CREATE INDEX this_name_is_t_1 ON sometable (foo)") + schemagen.buffer.truncate(0) + schemagen.visit_index(Index("this_other_name_is_too_long_for_what_were_doing", t1.c.foo)) + self.assertEquals(schemagen.buffer.getvalue(), "CREATE INDEX this_other_nam_2 ON sometable (foo)") + + schemadrop = dialect.schemadropper(dialect, None) + schemadrop.execute = lambda: None + self.assertRaises(exceptions.IdentifierError, schemadrop.visit_index, Index("this_name_is_too_long_for_what_were_doing", t1.c.foo)) + + </ins><span class="cx"> class ConstraintCompilationTest(TestBase, AssertsExecutionResults): </span><span class="cx"> class accum(object): </span><span class="cx"> def __init__(self): </span></span></pre> </div> </div> </body> </html> |