)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d5d5e9488ba3d485df84fc9a24cb8b17c4d14251","unresolved":false,"context_lines":[{"line_number":9,"context_line":"MySQL requires indexes on foreign keys. Such an index is created on the"},{"line_number":10,"context_line":"referencing table automatically if it does not exist."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Alembic have a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. But MySQL implicitly renames index at a named(!) fk"},{"line_number":15,"context_line":"re-creation in accordance to a naming convention:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAWn%2F%2F7zE%3D","line":12,"updated":"2014-04-08 13:30:11.000000000","message":"s/have/has","commit_id":"ff6a853bd6ec3e1e6ce993ba49c2dd96e31471d4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d5d5e9488ba3d485df84fc9a24cb8b17c4d14251","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Alembic have a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. But MySQL implicitly renames index at a named(!) fk"},{"line_number":15,"context_line":"re-creation in accordance to a naming convention:"},{"line_number":16,"context_line":"\u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude renamed"},{"line_number":17,"context_line":"index from comparision."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAWn%2F%2F7XM%3D","line":14,"updated":"2014-04-08 13:30:11.000000000","message":"I understand your surprise, but (!) is probably not needed :)","commit_id":"ff6a853bd6ec3e1e6ce993ba49c2dd96e31471d4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d5d5e9488ba3d485df84fc9a24cb8b17c4d14251","unresolved":false,"context_lines":[{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. But MySQL implicitly renames index at a named(!) fk"},{"line_number":15,"context_line":"re-creation in accordance to a naming convention:"},{"line_number":16,"context_line":"\u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude renamed"},{"line_number":17,"context_line":"index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Postgres doesn\u0027t create implicit fk indexes. To have appropriate tables"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAWn%2F%2F7GU%3D","line":16,"updated":"2014-04-08 13:30:11.000000000","message":"I\u0027m not sure this is the naming convention used by MySQL. It can also be migrate as well.","commit_id":"ff6a853bd6ec3e1e6ce993ba49c2dd96e31471d4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d5d5e9488ba3d485df84fc9a24cb8b17c4d14251","unresolved":false,"context_lines":[{"line_number":17,"context_line":"index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Postgres doesn\u0027t create implicit fk indexes. To have appropriate tables"},{"line_number":20,"context_line":"and models we must create fk indexes implicitly, exclusively for"},{"line_number":21,"context_line":"Postgres. An index must be existing in a model."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAWn%2F%2F7W8%3D","line":20,"updated":"2014-04-08 13:30:11.000000000","message":"explicitly :)","commit_id":"ff6a853bd6ec3e1e6ce993ba49c2dd96e31471d4"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d5d5e9488ba3d485df84fc9a24cb8b17c4d14251","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Postgres doesn\u0027t create implicit fk indexes. To have appropriate tables"},{"line_number":20,"context_line":"and models we must create fk indexes implicitly, exclusively for"},{"line_number":21,"context_line":"Postgres. An index must be existing in a model."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"},{"line_number":24,"context_line":"Partial-Bug: #1292591"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAWn%2F%2F7Wg%3D","line":21,"updated":"2014-04-08 13:30:11.000000000","message":"s/Posgres/for all backends, except MySQL","commit_id":"ff6a853bd6ec3e1e6ce993ba49c2dd96e31471d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"06168f3b96868931206b75b335938936fd4efb95","unresolved":false,"context_lines":[{"line_number":9,"context_line":"MySQL requires indexes on foreign keys. Such an index is created on the"},{"line_number":10,"context_line":"referencing table automatically if it does not exist."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Alembic has a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. MySQL 5.1 leaves an index name unchanged."},{"line_number":15,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming convention:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAXH%2F%2F79w%3D","line":12,"updated":"2014-04-16 12:01:40.000000000","message":"We don\u0027t use Alembic. Is this only a problem if we do?","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"be785d9f1de5117c8c7f23bf8c262d8a0af30b14","unresolved":false,"context_lines":[{"line_number":9,"context_line":"MySQL requires indexes on foreign keys. Such an index is created on the"},{"line_number":10,"context_line":"referencing table automatically if it does not exist."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Alembic has a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. MySQL 5.1 leaves an index name unchanged."},{"line_number":15,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming convention:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAXH%2F%2F6uk%3D","line":12,"in_reply_to":"AAAAXH%2F%2F79w%3D","updated":"2014-04-16 14:25:16.000000000","message":"Actually yes, we haven\u0027t used yet. But in this case we use. Please see https://review.openstack.org/#/c/80618/28/keystone/openstack/common/db/sqlalchemy/test_migrations.py","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"06168f3b96868931206b75b335938936fd4efb95","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude renamed"},{"line_number":17,"context_line":"index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Others db engines don\u0027t provide any implicit indexes. So we must guarantee"},{"line_number":20,"context_line":"that an index name always has the same name. It is possible via explicit"},{"line_number":21,"context_line":"index declaration."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAXH%2F%2F77o%3D","line":19,"updated":"2014-04-16 12:01:40.000000000","message":"I don\u0027t understand this comment because we are only taking action on MySQL here.","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"272f18943d5fecdbbc754fed37fa4c6d74a3aab5","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude renamed"},{"line_number":17,"context_line":"index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Others db engines don\u0027t provide any implicit indexes. So we must guarantee"},{"line_number":20,"context_line":"that an index name always has the same name. It is possible via explicit"},{"line_number":21,"context_line":"index declaration."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAXH%2F%2F4jI%3D","line":19,"in_reply_to":"AAAAXH%2F%2F6xY%3D","updated":"2014-04-16 17:52:07.000000000","message":"I mean this patch only applies the index to MySQL. Are you saying that you must explicitly specify the index for other engines?","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"be785d9f1de5117c8c7f23bf8c262d8a0af30b14","unresolved":false,"context_lines":[{"line_number":16,"context_line":"\u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude renamed"},{"line_number":17,"context_line":"index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Others db engines don\u0027t provide any implicit indexes. So we must guarantee"},{"line_number":20,"context_line":"that an index name always has the same name. It is possible via explicit"},{"line_number":21,"context_line":"index declaration."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"AAAAXH%2F%2F6xY%3D","line":19,"in_reply_to":"AAAAXH%2F%2F77o%3D","updated":"2014-04-16 14:25:16.000000000","message":"Are we? Aren\u0027t we using PostgreSQL and DB2? Please show me where I can find a list of engines which we are using?\nAnd, thanks you, this part is really redundant.","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":10,"context_line":"referencing table automatically if it does not exist."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Alembic has a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. MySQL 5.1 leaves an index name unchanged."},{"line_number":15,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":16,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAXH%2F%2F2SM%3D","line":13,"updated":"2014-04-17 01:00:19.000000000","message":"change \"waits for\" to \"expects\"","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Alembic has a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":13,"context_line":"implicit indexes from comparision.  The method waits for an index with the same"},{"line_number":14,"context_line":"name as an fk column name. MySQL 5.1 leaves an index name unchanged."},{"line_number":15,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":16,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":17,"context_line":"renamed index from comparision."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAXH%2F%2F2SI%3D","line":14,"updated":"2014-04-17 01:00:19.000000000","message":"change \"leaves an\" to \"leaves the\"\n\nMySQL changes the name? or is alembic?","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"name as an fk column name. MySQL 5.1 leaves an index name unchanged."},{"line_number":15,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":16,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":17,"context_line":"renamed index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"},{"line_number":20,"context_line":"Partial-Bug: #1292591"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAXH%2F%2F2R4%3D","line":17,"updated":"2014-04-17 01:00:19.000000000","message":"change \"index\" to \"indexes\"","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":15,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":16,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":17,"context_line":"renamed index from comparision."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"},{"line_number":20,"context_line":"Partial-Bug: #1292591"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"AAAAXH%2F%2F2Rg%3D","line":18,"updated":"2014-04-17 01:00:19.000000000","message":"suggest add a paragraph that describes the changes we should expect to see that fixes the problem, because I have no idea what to expect.","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Alembic has a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":17,"context_line":"implicit indexes from comparision.  The method expects for an index with the same"},{"line_number":18,"context_line":"name as an fk column name. MySQL 5.1 leaves the index name unchanged."},{"line_number":19,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":20,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":21,"context_line":"renamed indexes from comparision."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG6Y%3D","line":19,"updated":"2014-04-23 23:47:47.000000000","message":"re-creation? when does that happen?\n\nSeems like if we try to change the name of the indexes then mysql is just going to change it back sometime?","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Alembic has a method, named `correct_for_autogen_constraints`, to exclude"},{"line_number":17,"context_line":"implicit indexes from comparision.  The method expects for an index with the same"},{"line_number":18,"context_line":"name as an fk column name. MySQL 5.1 leaves the index name unchanged."},{"line_number":19,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":20,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":21,"context_line":"renamed indexes from comparision."},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC5s%3D","line":19,"in_reply_to":"AAAAXH%2F%2FG6Y%3D","updated":"2014-04-24 12:35:14.000000000","message":"This is mistake, furthermore this is complicated description. MySQL gives different indexes names, in dependence from version. I\u0027ll fix it.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"name as an fk column name. MySQL 5.1 leaves the index name unchanged."},{"line_number":19,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":20,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":21,"context_line":"renamed indexes from comparision."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Solution:"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG5M%3D","line":21,"updated":"2014-04-23 23:47:47.000000000","message":"why does this affect Keystone? We don\u0027t use alembic.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":18,"context_line":"name as an fk column name. MySQL 5.1 leaves the index name unchanged."},{"line_number":19,"context_line":"MySQL 5.5 renames an index at re-creation in accordance with a naming"},{"line_number":20,"context_line":"convention: \u003ccolumn_name\u003e_\u003cfk_column_name\u003e_fkey. Thus Alembic can\u0027t exclude"},{"line_number":21,"context_line":"renamed indexes from comparision."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Solution:"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC48%3D","line":21,"in_reply_to":"AAAAXH%2F%2FG5M%3D","updated":"2014-04-24 12:35:14.000000000","message":"We want to check models and database for consistency with Alembic. Please see https://review.openstack.org/#/c/74081/ and review it, if your kindness. I\u0027ll note it in the message.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Solution:"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Provided a migrations with fix possible fk indexes names inconsistency when"},{"line_number":26,"context_line":"MySQL used."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Reproduction:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG7s%3D","line":25,"updated":"2014-04-23 23:47:47.000000000","message":"change to\n\n A new migration script renames incorrectly named fk indexes on MySQL.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"Solution:"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Provided a migrations with fix possible fk indexes names inconsistency when"},{"line_number":26,"context_line":"MySQL used."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Reproduction:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC44%3D","line":25,"in_reply_to":"AAAAXH%2F%2FG7s%3D","updated":"2014-04-24 12:35:14.000000000","message":"Done","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* Checkout latest \"Comparision of database models and migrations\" test -"},{"line_number":35,"context_line":"I47444c4944f08535227718e368a1950c45c6cb32"},{"line_number":36,"context_line":"* Remove the migrations provided with this patch."},{"line_number":37,"context_line":"* run `tox -e py2* -- test_sync_migrations`"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"You will see that the indexes were renamed during migrations by"},{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG7k%3D","line":37,"updated":"2014-04-23 23:47:47.000000000","message":"Reproducing this doesn\u0027t require this much work. Just look at the schema.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":34,"context_line":"* Checkout latest \"Comparision of database models and migrations\" test -"},{"line_number":35,"context_line":"I47444c4944f08535227718e368a1950c45c6cb32"},{"line_number":36,"context_line":"* Remove the migrations provided with this patch."},{"line_number":37,"context_line":"* run `tox -e py2* -- test_sync_migrations`"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"You will see that the indexes were renamed during migrations by"},{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC3Q%3D","line":37,"in_reply_to":"AAAAXH%2F%2FG7k%3D","updated":"2014-04-24 12:35:14.000000000","message":"Do you want just to look how MySQL behaves? Without tests running?","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":36,"context_line":"* Remove the migrations provided with this patch."},{"line_number":37,"context_line":"* run `tox -e py2* -- test_sync_migrations`"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"You will see that the indexes were renamed during migrations by"},{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"},{"line_number":41,"context_line":"the differences appeared as a result of the process isn\u0027t significant, so"},{"line_number":42,"context_line":"Alembic trys to take care about it, but it can\u0027t do nothing with 5.5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG7Y%3D","line":39,"updated":"2014-04-23 23:47:47.000000000","message":"which migration renamed the indexes?","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"* Remove the migrations provided with this patch."},{"line_number":37,"context_line":"* run `tox -e py2* -- test_sync_migrations`"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"You will see that the indexes were renamed during migrations by"},{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"},{"line_number":41,"context_line":"the differences appeared as a result of the process isn\u0027t significant, so"},{"line_number":42,"context_line":"Alembic trys to take care about it, but it can\u0027t do nothing with 5.5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC3c%3D","line":39,"in_reply_to":"AAAAXH%2F%2FG7Y%3D","updated":"2014-04-24 12:35:14.000000000","message":"Same mistake. I\u0027ll fix it.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"You will see that the indexes were renamed during migrations by"},{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"},{"line_number":41,"context_line":"the differences appeared as a result of the process isn\u0027t significant, so"},{"line_number":42,"context_line":"Alembic trys to take care about it, but it can\u0027t do nothing with 5.5"},{"line_number":43,"context_line":"version behavior."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG68%3D","line":42,"updated":"2014-04-23 23:47:47.000000000","message":"change \"trys\" to \"tries\"\n\nchange \"it can\u0027t do nothing with\" to \"it doesn\u0027t support the\"","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":39,"context_line":"You will see that the indexes were renamed during migrations by"},{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"},{"line_number":41,"context_line":"the differences appeared as a result of the process isn\u0027t significant, so"},{"line_number":42,"context_line":"Alembic trys to take care about it, but it can\u0027t do nothing with 5.5"},{"line_number":43,"context_line":"version behavior."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC34%3D","line":42,"in_reply_to":"AAAAXH%2F%2FG68%3D","updated":"2014-04-24 12:35:14.000000000","message":"Done","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"},{"line_number":41,"context_line":"the differences appeared as a result of the process isn\u0027t significant, so"},{"line_number":42,"context_line":"Alembic trys to take care about it, but it can\u0027t do nothing with 5.5"},{"line_number":43,"context_line":"version behavior."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"},{"line_number":46,"context_line":"Partial-Bug: #1292591"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FG60%3D","line":43,"updated":"2014-04-23 23:47:47.000000000","message":"why isn\u0027t this a bug in alembic? Doesn\u0027t it need to support MySQL 5.5?","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":40,"context_line":"MySQL 5.5 server. The behavior of implicit indexes is MySQL specific and"},{"line_number":41,"context_line":"the differences appeared as a result of the process isn\u0027t significant, so"},{"line_number":42,"context_line":"Alembic trys to take care about it, but it can\u0027t do nothing with 5.5"},{"line_number":43,"context_line":"version behavior."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Change-Id: I01ba0c8856afbda59394395ac319bf83a55ee2be"},{"line_number":46,"context_line":"Partial-Bug: #1292591"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"AAAAXH%2F%2FC3w%3D","line":43,"in_reply_to":"AAAAXH%2F%2FG60%3D","updated":"2014-04-24 12:35:14.000000000","message":"It is, but this has not fixed yet.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"}],"keystone/common/sql/migrate_repo/versions/050_fk_consistent_indexes.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    user_group_membership \u003d sa.Table(\u0027user_group_membership\u0027,"},{"line_number":23,"context_line":"                                     meta, autoload\u003dTrue)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":26,"context_line":"        # NOTE(i159): MySQL requires indexes on referencing columns, and those"},{"line_number":27,"context_line":"        # indexes create automatically. That those indexes will have different"},{"line_number":28,"context_line":"        # names, depending on version of MySQL used. We shoud make this naming"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAXH%2F%2F2RQ%3D","line":25,"updated":"2014-04-17 01:00:19.000000000","message":"since the previous lines don\u0027t do anything by themselves, move them into the \u0027if\u0027 leg.\n\nAlso, might as well\n\n if migrate_engine.name !\u003d \u0027mysql\u0027:\n    # This migration only applies to MySQL\n    return\n\nthen can unindent","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def downgrade(migrate_engine):"},{"line_number":40,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAXH%2F%2F2Q8%3D","line":40,"updated":"2014-04-17 01:00:19.000000000","message":"this needs a comment why there\u0027s no downgrade.","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":23,"context_line":"        endpoint \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"        user_group_membership \u003d sa.Table(\u0027user_group_membership\u0027,"},{"line_number":25,"context_line":"                                         meta, autoload\u003dTrue)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        # NOTE(i159): MySQL requires indexes on referencing columns, and those"},{"line_number":28,"context_line":"        # indexes create automatically. That those indexes will have different"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2FG5A%3D","line":25,"updated":"2014-04-23 23:47:47.000000000","message":"suggest move this down to where it\u0027s used.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":22,"context_line":"        meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":23,"context_line":"        endpoint \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":24,"context_line":"        user_group_membership \u003d sa.Table(\u0027user_group_membership\u0027,"},{"line_number":25,"context_line":"                                         meta, autoload\u003dTrue)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        # NOTE(i159): MySQL requires indexes on referencing columns, and those"},{"line_number":28,"context_line":"        # indexes create automatically. That those indexes will have different"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2FEYY%3D","line":25,"in_reply_to":"AAAAXH%2F%2FG5A%3D","updated":"2014-04-24 12:35:14.000000000","message":"Done","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"6c235ea769a1c15f35bd79803bb8179ac479245e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":31,"context_line":"        if any(i for i in endpoint.indexes if"},{"line_number":32,"context_line":"               i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027):"},{"line_number":33,"context_line":"            sa.Index(\u0027service_id\u0027, endpoint.c.service_id).create()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        if any(i for i in user_group_membership.indexes if"},{"line_number":36,"context_line":"               i.columns.keys() \u003d\u003d [\u0027group_id\u0027] and i.name !\u003d \u0027group_id\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2FG5E%3D","line":33,"updated":"2014-04-23 23:47:47.000000000","message":"Add a comment that this actually renames the existing index rather than creating a new one. Or, move the comment at line 37-39 to before line 31 here... \n\n \"Creating\" an index with the same cols as an existing index renames the index\n on mysql. A new index isn\u0027t created.","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"6abf2761ba32fa4a4011ed1f643b55c55b0566cc","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":31,"context_line":"        if any(i for i in endpoint.indexes if"},{"line_number":32,"context_line":"               i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027):"},{"line_number":33,"context_line":"            sa.Index(\u0027service_id\u0027, endpoint.c.service_id).create()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        if any(i for i in user_group_membership.indexes if"},{"line_number":36,"context_line":"               i.columns.keys() \u003d\u003d [\u0027group_id\u0027] and i.name !\u003d \u0027group_id\u0027):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAXH%2F%2FC2c%3D","line":33,"in_reply_to":"AAAAXH%2F%2FG5E%3D","updated":"2014-04-24 12:35:14.000000000","message":"Done","commit_id":"fecfb1c9b4db2e9d83f91f738a1297c3e6fd8cfa"}],"keystone/common/sql/migrate_repo/versions/050_service_id_index.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"782646560e2db4359cece3420f0715711a765858","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":21,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    idx_names \u003d [i.name for i in endpoint_table.indexes]"},{"line_number":24,"context_line":"    if \u0027endpoint_service_id_fkey\u0027 not in idx_names:"},{"line_number":25,"context_line":"        sa.Index(\u0027endpoint_service_id_fkey\u0027,"},{"line_number":26,"context_line":"                 endpoint_table.c.service_id).create()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9mPM%3D","line":23,"updated":"2014-04-03 13:09:18.000000000","message":"This is the thing I hate most in our migrations scripts: they are \u0027smart\u0027 when they they should really be \u0027dumb\u0027 - schema reflection shouldn\u0027t be needed...\n\nSo yes, this makes the test suite pass on CI, but doesn\u0027t answer the question, why we can\u0027t reproduce the problem on local environments.\n\nI\u0027d suggest to spend a bit more time to find the reason of the problem, rather than fix symptoms here.","commit_id":"b7aaa0230979c4b6109b7f63ec8006afbaf185cd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"071ef9c1ea10a5d01ee7139ae000c3b30b78642e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":21,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    idx_names \u003d [i.name for i in endpoint_table.indexes]"},{"line_number":24,"context_line":"    if \u0027endpoint_service_id_fkey\u0027 not in idx_names:"},{"line_number":25,"context_line":"        sa.Index(\u0027endpoint_service_id_fkey\u0027,"},{"line_number":26,"context_line":"                 endpoint_table.c.service_id).create()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9kYY%3D","line":23,"in_reply_to":"AAAAWH%2F9mNQ%3D","updated":"2014-04-03 16:22:30.000000000","message":"some migrations scripts try to be smart because we\u0027re aware of operators that have already introduced a specific index, for example. in this case, i don\u0027t see a reason for this migration to be defensive like that","commit_id":"b7aaa0230979c4b6109b7f63ec8006afbaf185cd"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"2318955b3fe8e6e9ae850203fb039769d92fa80c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":21,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    idx_names \u003d [i.name for i in endpoint_table.indexes]"},{"line_number":24,"context_line":"    if \u0027endpoint_service_id_fkey\u0027 not in idx_names:"},{"line_number":25,"context_line":"        sa.Index(\u0027endpoint_service_id_fkey\u0027,"},{"line_number":26,"context_line":"                 endpoint_table.c.service_id).create()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9mNQ%3D","line":23,"in_reply_to":"AAAAWH%2F9mPM%3D","updated":"2014-04-03 13:12:01.000000000","message":"Ok, I\u0027ll do my best.","commit_id":"b7aaa0230979c4b6109b7f63ec8006afbaf185cd"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"782646560e2db4359cece3420f0715711a765858","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":31,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    idx_names \u003d [i.name for i in endpoint_table.indexes]"},{"line_number":34,"context_line":"    if \u0027endpoint_service_id_fkey\u0027 in idx_names:"},{"line_number":35,"context_line":"        sa.Index(\u0027endpoint_service_id_fkey\u0027,"},{"line_number":36,"context_line":"                 endpoint_table.c.service_id).drop()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAWH%2F9mOw%3D","line":33,"updated":"2014-04-03 13:09:18.000000000","message":"why would we need to use reflection here? we know, that upgrade() creates the index, if one doesn\u0027t exist","commit_id":"b7aaa0230979c4b6109b7f63ec8006afbaf185cd"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"129a0d8009df224542efc449e3a1761dfac51113","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sqlalchemy as sa"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"old_name \u003d None"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAW3%2F%2F9ZI%3D","line":19,"updated":"2014-04-09 08:55:40.000000000","message":"This is not needed.","commit_id":"3c0d70bbed27f452e8a8c55198136329228304e6"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"129a0d8009df224542efc449e3a1761dfac51113","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":27,"context_line":"        for i in endpoint_table.indexes:"},{"line_number":28,"context_line":"            if \u0027service_id\u0027 in i.name and i.name !\u003d \u0027service_id\u0027:"},{"line_number":29,"context_line":"                global old_name"},{"line_number":30,"context_line":"                old_name \u003d i.name"},{"line_number":31,"context_line":"                i.rename(\u0027service_id\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAW3%2F%2F9XI%3D","line":28,"updated":"2014-04-09 08:55:40.000000000","message":"Perhaps, checking of the index columns is more explicit than checking that the index name contains \u0027service_id\u0027:\n\nif i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027:\n    i.rename(\u0027service_id\u0027)\n    break\n\nAnd we definitely don\u0027t need old_name global variable here.","commit_id":"3c0d70bbed27f452e8a8c55198136329228304e6"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"129a0d8009df224542efc449e3a1761dfac51113","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":38,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":41,"context_line":"        for i in endpoint_table.indexes:"},{"line_number":42,"context_line":"            global old_name"},{"line_number":43,"context_line":"            if i.name \u003d\u003d \u0027service_id\u0027 and old_name:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAW3%2F%2F9Tk%3D","line":40,"updated":"2014-04-09 08:55:40.000000000","message":"I\u0027d actually suggest to make this no-op for MySQL: this is a MySQL specific index and the only thing we care about is that it has a consistent name across all MySQL versions; I see no point in restoring the old, probably incorrect name - let\u0027s just keep it called \u0027service_id\u0027.","commit_id":"3c0d70bbed27f452e8a8c55198136329228304e6"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"16e5c8cf23e32137b70e58c27ceba2d9539a875a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":32,"context_line":"        sa.Index(\u0027service_id\u0027, endpoint_table.c.service_id).drop()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2Fy1s%3D","line":32,"updated":"2014-04-10 11:21:47.000000000","message":"This will probably fail (as MySQL requires at least one index to exist on the referencing column). I think, we could go for a no-op downgrade here.\n\nDo we test downgrades in tests?","commit_id":"9e76b5056bf4cd89b1d8ba5f4b89e22557b72ebc"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"bdff9746b8326bb37f9960318b2eb84e399e6d2e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":32,"context_line":"        sa.Index(\u0027service_id\u0027, endpoint_table.c.service_id).drop()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2Fyuc%3D","line":32,"in_reply_to":"AAAAW3%2F%2Fy0I%3D","updated":"2014-04-10 11:35:32.000000000","message":"Even not typo. Sure you are right, we shouldn\u0027t do nothing in downgrade.","commit_id":"9e76b5056bf4cd89b1d8ba5f4b89e22557b72ebc"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"e34452ea29305ad5f697a884deb16b47ce3afa0e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    endpoint_table \u003d sa.Table(\u0027endpoint\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":32,"context_line":"        sa.Index(\u0027service_id\u0027, endpoint_table.c.service_id).drop()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2Fy0I%3D","line":32,"in_reply_to":"AAAAW3%2F%2Fy1s%3D","updated":"2014-04-10 11:24:41.000000000","message":"Ohhh! I mess this typo...","commit_id":"9e76b5056bf4cd89b1d8ba5f4b89e22557b72ebc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1e6eb626bf635c20a81fc6fc282debf90c1cb5b0","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":24,"context_line":"        index \u003d \u0027service_id\u0027"},{"line_number":25,"context_line":"        if (i for i in table.indexes if i.name !\u003d index and index in i.name):"},{"line_number":26,"context_line":"            sa.Index(index, table.c.service_id).create()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2Fokw%3D","line":25,"updated":"2014-04-11 14:42:54.000000000","message":"This will return a generator object so I would expect this if to always execute. Is this just trying to look for the index and execute if it doesn\u0027t exist?","commit_id":"813730b58cb241dd475b87d376ec2adb43797329"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"4466b2e96545aca953efe4f35d067728f9a4aa60","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":24,"context_line":"        index \u003d \u0027service_id\u0027"},{"line_number":25,"context_line":"        if (i for i in table.indexes if i.name !\u003d index and index in i.name):"},{"line_number":26,"context_line":"            sa.Index(index, table.c.service_id).create()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2FoRg%3D","line":25,"in_reply_to":"AAAAW3%2F%2Fokw%3D","updated":"2014-04-11 15:21:09.000000000","message":"Yes, you are right, it shouldn\u0027t be a generator. This check trying to find renamed index, i.e. the index containing correct name but not equal to the correct name. There is a couple of problems:\n\n* Index would be renamed with MySQL 5.5\n* Index wouldn\u0027t be renamed with MySQL 5.1\n* We cant substitute an index to another one with the same name, this will cause an error.\n\nI\u0027ll fix my mess and document this difficult behavior in the code.\nThanks!","commit_id":"813730b58cb241dd475b87d376ec2adb43797329"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d1204c10b4e83562ccb31e310a085c8cee2c9271","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # the referencing table automatically if it does not exist."},{"line_number":28,"context_line":"        # * MySQL 5.5. renames fk indexes, MySQL 5.1 leaves an indexes without"},{"line_number":29,"context_line":"        # changes."},{"line_number":30,"context_line":"        # * Alembic can exclude from comparision only index with the name equal"},{"line_number":31,"context_line":"        # to a column name."},{"line_number":32,"context_line":"        # * We need to explicitly revert an index name if it was renamed,"},{"line_number":33,"context_line":"        # to have version independent behavior."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2Fh2s%3D","line":30,"updated":"2014-04-13 18:34:04.000000000","message":"While I understand your problem here, I don\u0027t think it\u0027s a valid argument. From your statement it seems that alembic is to blame, rather than mysql :)\n\nSo I\u0027d suggest to rephrase your note: IMO, all you need to mention here, is that MySQL requires indexes on referencing columns, and those indexes are created automatically. The problem is, that those indexes will have different names, depending on version of MySQL used. All we want to do here is to make this naming consistent. In order to achieve this we check existing indexes on the column we are interested in, and rename the index (curiously, MySQL will rename the index automatically when we try to create an index explicitly)","commit_id":"a0a97ba376db93237180f3e6513eed934325f15c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"df110b7756d3deee08343fd5ebcc14d38eace434","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # the referencing table automatically if it does not exist."},{"line_number":28,"context_line":"        # * MySQL 5.5. renames fk indexes, MySQL 5.1 leaves an indexes without"},{"line_number":29,"context_line":"        # changes."},{"line_number":30,"context_line":"        # * Alembic can exclude from comparision only index with the name equal"},{"line_number":31,"context_line":"        # to a column name."},{"line_number":32,"context_line":"        # * We need to explicitly revert an index name if it was renamed,"},{"line_number":33,"context_line":"        # to have version independent behavior."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2FfFA%3D","line":30,"in_reply_to":"AAAAW3%2F%2Fh2s%3D","updated":"2014-04-14 09:45:50.000000000","message":"Ok, I\u0027ll rephrase it.\n\nPlease, see my point to leave it as is.\n\nI\u0027m not blaming nothing here, really. If I will remove the point about Alembic, several questions could be arised: \"why do we care only about MySQL?\", \"Why do we care about it at all, if Alembic can help us with this problem?\". If I will remove detailed description about versions, questions could be arised too. Such as: \"Why do we suggest the index may have the same name with the column and may differ?\", \"Why do we care about the case when the name matches?\".","commit_id":"a0a97ba376db93237180f3e6513eed934325f15c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d1204c10b4e83562ccb31e310a085c8cee2c9271","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # * Substitute an index with the same name is impossible"},{"line_number":37,"context_line":"        # too, it causes an error."},{"line_number":38,"context_line":"        # So we must ensure that correct index was renamed and revert it."},{"line_number":39,"context_line":"        if [i for i in table.indexes if i.name !\u003d index and index in i.name]:"},{"line_number":40,"context_line":"            sa.Index(index, table.c.service_id).create()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2Fh2c%3D","line":39,"updated":"2014-04-13 18:34:04.000000000","message":"The predicate should really be:\n\n  if i.columns \u003d\u003d (\u0027service_id\u0027,) and i.name !\u003d \u0027service_id\u0027\n\nA \u0027stylistic\u0027 note. I\u0027d rather see this written like this:\n\n    if any(i for i in table.indexes if i.columns \u003d\u003d (\u0027service_id\u0027,) and i.name !\u003d \u0027service_id\u0027):","commit_id":"a0a97ba376db93237180f3e6513eed934325f15c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"df110b7756d3deee08343fd5ebcc14d38eace434","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # * Substitute an index with the same name is impossible"},{"line_number":37,"context_line":"        # too, it causes an error."},{"line_number":38,"context_line":"        # So we must ensure that correct index was renamed and revert it."},{"line_number":39,"context_line":"        if [i for i in table.indexes if i.name !\u003d index and index in i.name]:"},{"line_number":40,"context_line":"            sa.Index(index, table.c.service_id).create()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2FfVU%3D","line":39,"in_reply_to":"AAAAW3%2F%2Fh2c%3D","updated":"2014-04-14 09:45:50.000000000","message":"Hmm... Yep. I had wanted to prevent undesired renaming of an indexes on the table. But, we know for sure that the table have a single index. From other side, we cant even create several indexes for the same columns list (ridiculous idea, hehe). So, I agree.","commit_id":"a0a97ba376db93237180f3e6513eed934325f15c"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"8a82a42b1dc185bd836910028833ff064184796c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":28,"context_line":"        if any(i for i in table.indexes if"},{"line_number":29,"context_line":"               i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027):"},{"line_number":30,"context_line":"            sa.Index(\u0027service_id\u0027, table.c.service_id).create()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FWIk%3D","line":30,"updated":"2014-04-15 08:54:37.000000000","message":"Note for other reviewers.\n\nCuriously, MySQL will automatically rename the implicitly created index on the referencing column here. Thus we achieve the consistent naming across all versions of MySQL.","commit_id":"84b8d1684d268fbcf667ca3a926ec567e26c5e5f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"06168f3b96868931206b75b335938936fd4efb95","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":28,"context_line":"        if any(i for i in table.indexes if"},{"line_number":29,"context_line":"               i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027):"},{"line_number":30,"context_line":"            sa.Index(\u0027service_id\u0027, table.c.service_id).create()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2F78E%3D","line":30,"updated":"2014-04-16 12:01:40.000000000","message":"What is driving this naming convention? It is different from other indexes that the explicitly declare. Also, does this actually rename the existing index or just create another?","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"272f18943d5fecdbbc754fed37fa4c6d74a3aab5","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":28,"context_line":"        if any(i for i in table.indexes if"},{"line_number":29,"context_line":"               i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027):"},{"line_number":30,"context_line":"            sa.Index(\u0027service_id\u0027, table.c.service_id).create()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2F4hY%3D","line":30,"in_reply_to":"AAAAXH%2F%2F6rs%3D","updated":"2014-04-16 17:52:07.000000000","message":"Should it be different? Why not follow the convention which I think would make it \u0027ix_service_id\u0027? I\u0027m just curious about how you chose this name.","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":7536,"name":"Ilya Pekelny","email":"ipekelny@mirantis.com","username":"I159"},"change_message_id":"be785d9f1de5117c8c7f23bf8c262d8a0af30b14","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":28,"context_line":"        if any(i for i in table.indexes if"},{"line_number":29,"context_line":"               i.columns.keys() \u003d\u003d [\u0027service_id\u0027] and i.name !\u003d \u0027service_id\u0027):"},{"line_number":30,"context_line":"            sa.Index(\u0027service_id\u0027, table.c.service_id).create()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2F6rs%3D","line":30,"in_reply_to":"AAAAXH%2F%2F78E%3D","updated":"2014-04-16 14:25:16.000000000","message":"\u003e\u003e\u003e What is driving this naming convention?\n\nIf you mean naming convention used at renaming, it is MySQL, only 5.5. \n\n\n\u003e\u003e\u003e  It is different from other indexes that the explicitly declare.\n\nYes it is.\n\n\n\u003e\u003e\u003e Also, does this actually rename the existing index or just create another?\n\nMySQL cant rename indexes. It just create another.","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"}],"keystone/contrib/oauth1/migrate_repo/versions/005_consumer_id_index.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"129a0d8009df224542efc449e3a1761dfac51113","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import sqlalchemy as sa"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"old_name \u003d None"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAW3%2F%2F9Sk%3D","line":19,"updated":"2014-04-09 08:55:40.000000000","message":"ditto here and below","commit_id":"3c0d70bbed27f452e8a8c55198136329228304e6"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"16e5c8cf23e32137b70e58c27ceba2d9539a875a","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":29,"context_line":"    access_token \u003d sa.Table(\u0027access_token\u0027, meta, autoload\u003dTrue)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":32,"context_line":"        sa.Index(\u0027consumer_id\u0027, access_token.c.consumer_id).drop()"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAW3%2F%2Fy1M%3D","line":31,"updated":"2014-04-10 11:21:47.000000000","message":"ditto","commit_id":"9e76b5056bf4cd89b1d8ba5f4b89e22557b72ebc"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1e6eb626bf635c20a81fc6fc282debf90c1cb5b0","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":24,"context_line":"        index \u003d \u0027consumer_id\u0027"},{"line_number":25,"context_line":"        if (i for i in table.indexes if i.name !\u003d index and index in i.name):"},{"line_number":26,"context_line":"            sa.Index(index, table.c.consumer_id).create()"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAW3%2F%2Fokg%3D","line":25,"updated":"2014-04-11 14:42:54.000000000","message":"Same problem here","commit_id":"813730b58cb241dd475b87d376ec2adb43797329"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d1204c10b4e83562ccb31e310a085c8cee2c9271","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":24,"context_line":"        index \u003d \u0027consumer_id\u0027"},{"line_number":25,"context_line":"        # NOTE(i159): several problems solved here:"},{"line_number":26,"context_line":"        # * MySQL requires indexes on foreign keys. Such an index is created on"},{"line_number":27,"context_line":"        # the referencing table automatically if it does not exist."},{"line_number":28,"context_line":"        # * MySQL 5.5. renames fk indexes, MySQL 5.1 leaves an indexes without"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAW3%2F%2Fh2M%3D","line":25,"updated":"2014-04-13 18:34:04.000000000","message":"ditto","commit_id":"a0a97ba376db93237180f3e6513eed934325f15c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"06168f3b96868931206b75b335938936fd4efb95","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # consistent, by reverting index name to a consistent condition."},{"line_number":28,"context_line":"        if any(i for i in table.indexes if i.columns.keys() \u003d\u003d [\u0027consumer_id\u0027]"},{"line_number":29,"context_line":"               and i.name !\u003d \u0027consumer_id\u0027):"},{"line_number":30,"context_line":"            sa.Index(\u0027consumer_id\u0027, table.c.consumer_id).create()"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAXH%2F%2F77w%3D","line":30,"updated":"2014-04-16 12:01:40.000000000","message":"Same comment as other file.","commit_id":"c11af0bc165b833f651ef65d00b6bcdc0c43fe9c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    meta \u003d sa.MetaData(bind\u003dmigrate_engine)"},{"line_number":21,"context_line":"    table \u003d sa.Table(\u0027access_token\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    if migrate_engine.name \u003d\u003d \u0027mysql\u0027:"},{"line_number":24,"context_line":"        # NOTE(i159): MySQL requires indexes on referencing columns, and those"},{"line_number":25,"context_line":"        # indexes create automatically. That those indexes will have different"},{"line_number":26,"context_line":"        # names, depending on version of MySQL used. We shoud make this naming"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAXH%2F%2F2Q0%3D","line":23,"updated":"2014-04-17 01:00:19.000000000","message":"similar comment on the other part. the previous code doesn\u0027t have any side effects so don\u0027t do it if we don\u0027t need to.","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"d21614099358da2527ea9a0b0ff3efb4923452e2","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"def downgrade(migrate_engine):"},{"line_number":34,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAXH%2F%2F2Q4%3D","line":34,"updated":"2014-04-17 01:00:19.000000000","message":"this needs a comment why there\u0027s no downgrade.","commit_id":"4b00de13717ee9692b6b0c1a5eec0a9b82ede5b8"}]}
