)]}'
{"ceilometer/storage/sqlalchemy/migrate_repo/versions/028_alembic_migrations.py":[{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d6bcd5a3d51943f9640ed7bcd919380fda3428dc","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        a_ver \u003d sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"        return sa.select([a_ver.c.version_num]).scalar()"},{"line_number":26,"context_line":"    except (sa.exc.NoSuchTableError, AttributeError):"},{"line_number":27,"context_line":"        return None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BYA%3D","line":26,"updated":"2014-03-10 23:02:12.000000000","message":"I don\u0027t think it\u0027s a good idea to catch all AttributeError exceptions here.\n\nCould you please tell what the original error was? Just looking at this code, I can\u0027t think of a situation when AttributeError would be an \u0027ok\u0027 runtime result here.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"d8181866aabf473d4d148e5f614abcd7a25e59d9","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        a_ver \u003d sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"        return sa.select([a_ver.c.version_num]).scalar()"},{"line_number":26,"context_line":"    except (sa.exc.NoSuchTableError, AttributeError):"},{"line_number":27,"context_line":"        return None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BFI%3D","line":26,"in_reply_to":"AAAAVn%2F%2B%2BPE%3D","updated":"2014-03-10 23:50:43.000000000","message":"a little background, ceilometer prematurely jumped to alembic in icehouse. this sqlalchemy-migrate script was to revert those scripts to to sql-migrate. so in a fresh db, there won\u0027t be a alembic table","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7f3c035d1a23f8e8051622907eb3cf7a8d1208ea","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        a_ver \u003d sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"        return sa.select([a_ver.c.version_num]).scalar()"},{"line_number":26,"context_line":"    except (sa.exc.NoSuchTableError, AttributeError):"},{"line_number":27,"context_line":"        return None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BPE%3D","line":26,"in_reply_to":"AAAAVn%2F%2B%2BUo%3D","updated":"2014-03-10 23:21:35.000000000","message":"alembic_version is a table created by alembic to track the current version of the database schema. I checked alembic git log - the name of version_num column hasn\u0027t changed since the commit it was introduced in.\n\nIf the table was successfully reflected at line 24 (NoSuchTableError wasn\u0027t raised), than line 25 should work just fine without raising AttributeError.\n\nThis must have nothing to do with SQLAlchemy versions, IMO. Purely alembic stuff. I\u0027m cloning Ceilometer to take a closer look right now.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2033be6d9d8725cd5829f7f53c4222a29cf51f2a","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    try:"},{"line_number":24,"context_line":"        a_ver \u003d sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"        return sa.select([a_ver.c.version_num]).scalar()"},{"line_number":26,"context_line":"    except (sa.exc.NoSuchTableError, AttributeError):"},{"line_number":27,"context_line":"        return None"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BUo%3D","line":26,"in_reply_to":"AAAAVn%2F%2B%2BYA%3D","updated":"2014-03-10 23:05:11.000000000","message":"when delete is called, a_ver.c.version_num returns an AttributeError.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"d6bcd5a3d51943f9640ed7bcd919380fda3428dc","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def delete_alembic(meta):"},{"line_number":31,"context_line":"    # NOTE(sdague): sqla 0.9 doesn\u0027t protect you in the same way"},{"line_number":32,"context_line":"    # in a drop operation as 0.8 does, so you get a naked mysql"},{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BVk%3D","line":31,"updated":"2014-03-10 23:02:12.000000000","message":"Hmm, I think it\u0027s not drop() but rather autoload\u003dTrue who raises NoSuchTableError. drop() indeed raised a naked mysql exception, but the behaviour is the same for sqla 0.8 and 0.9","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"d8181866aabf473d4d148e5f614abcd7a25e59d9","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def delete_alembic(meta):"},{"line_number":31,"context_line":"    # NOTE(sdague): sqla 0.9 doesn\u0027t protect you in the same way"},{"line_number":32,"context_line":"    # in a drop operation as 0.8 does, so you get a naked mysql"},{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BE4%3D","line":31,"in_reply_to":"AAAAVn%2F%2B%2BKo%3D","updated":"2014-03-10 23:50:43.000000000","message":"hmm. i can\u0027t even make it to 028 script when i upgrade to 0.9.3. it fails on 012 script for me.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"71cf3a9f3eb6a81dad7752bff8723c82a1e6a82d","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def delete_alembic(meta):"},{"line_number":31,"context_line":"    # NOTE(sdague): sqla 0.9 doesn\u0027t protect you in the same way"},{"line_number":32,"context_line":"    # in a drop operation as 0.8 does, so you get a naked mysql"},{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BKo%3D","line":31,"in_reply_to":"AAAAVn%2F%2B%2BOo%3D","updated":"2014-03-10 23:33:13.000000000","message":"well, you are incorrect, because it was when using SQLA 0.9.3.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"7f3c035d1a23f8e8051622907eb3cf7a8d1208ea","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def delete_alembic(meta):"},{"line_number":31,"context_line":"    # NOTE(sdague): sqla 0.9 doesn\u0027t protect you in the same way"},{"line_number":32,"context_line":"    # in a drop operation as 0.8 does, so you get a naked mysql"},{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BOo%3D","line":31,"in_reply_to":"AAAAVn%2F%2B%2BUQ%3D","updated":"2014-03-10 23:21:35.000000000","message":"If table existed, than drop() would succeed. If it wasn\u0027t, NoSuchTableError would be raised during reflection (so DROP wouldn\u0027t ever be emitted). So this shouldn\u0027t be an issue.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2033be6d9d8725cd5829f7f53c4222a29cf51f2a","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def delete_alembic(meta):"},{"line_number":31,"context_line":"    # NOTE(sdague): sqla 0.9 doesn\u0027t protect you in the same way"},{"line_number":32,"context_line":"    # in a drop operation as 0.8 does, so you get a naked mysql"},{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BUQ%3D","line":31,"in_reply_to":"AAAAVn%2F%2B%2BVk%3D","updated":"2014-03-10 23:05:11.000000000","message":"Well the naked mysql exception was coming all the way to the surface.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"a92fc6e1126dce33726af0de45588327d4ce0525","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue).drop()"},{"line_number":37,"context_line":"        except sa.exc.NoSuchTableError:"},{"line_number":38,"context_line":"            pass"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BX8%3D","line":36,"updated":"2014-03-10 22:57:50.000000000","message":"out of curiosity. can we use checkfirst\u003dTrue param?\n\nseems to exists in both 0.7 and 0.9:\nhttp://docs.sqlalchemy.org/en/rel_0_7/core/schema.html?highlight\u003ddrop%20table#sqlalchemy.schema.Table.drop\nhttp://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.Table.drop","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"b1878653c64e2105fde87f65182ced7c831ad5aa","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue).drop()"},{"line_number":37,"context_line":"        except sa.exc.NoSuchTableError:"},{"line_number":38,"context_line":"            pass"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B988%3D","line":36,"in_reply_to":"AAAAVn%2F%2B%2BBI%3D","updated":"2014-03-11 00:17:46.000000000","message":"so yes, checkfirst\u003dTrue work for me too with SQLAlchemy 0.9.3 and sqlalchemy-migrate 0.9. This seems to be the only workaround we need.\n\nI bisected the problem to the particular SQLAlchemy commit (https://github.com/zzzeek/sqlalchemy/commit/f6198d9abf453182f4b111e0579a7a4ef1614e79). Since that commit, tables are added to metadata instances even when autoload fails (e.g. with NoSuchTableError). This explains why checkfirst\u003dTrue works:\n\n1. At line 114 we are trying to reflect alembic_version table. It fails, as there no such table in the database. Nevertheless, alembic_version table is added to meta.tables registry used by SQLAlchemy.\n\n2. At line 139 we are trying to delete alembic_version table. If it wasn\u0027t in meta.tables registry we would exit gracefully at line  37, but it\u0027s already in the registry - it won\u0027t be reflected the second time and NoSuchTableError won\u0027t be raised.\n\n3. checkfirst\u003dTrue tells SQLAlchemy to check if table really exists before emitting DROP (even if the table is present in meta.tables registry).\n\nThis must be an issue in SQLAlchemy introduced during refactoring. I\u0027m going to file a bug on bitbucket (if autoloading fails, the table shouldn\u0027t be added to meta.tables registry).\n\nAt the same time, we can use checkfirst\u003dTrue with no harm for us.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"ae15aa0721248d55dd6520c2d9d0fe9f6b632e6d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue).drop()"},{"line_number":37,"context_line":"        except sa.exc.NoSuchTableError:"},{"line_number":38,"context_line":"            pass"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BBI%3D","line":36,"in_reply_to":"AAAAVn%2F%2B%2BU4%3D","updated":"2014-03-11 00:07:55.000000000","message":"Sean, setting checkfirst\u003dTrue works for me.\n\nthat said, the requirements are not right. sqlalchemy-0.9.3 does not work with slqalchemy-migrate 0.8.2 (i could only get to this script with migrate 0.9 installed.)","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"5f3d7eac030378bfc088ab5c2f998bcf066c7ab6","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    # exception."},{"line_number":34,"context_line":"    if get_alembic_version(meta) is not None:"},{"line_number":35,"context_line":"        try:"},{"line_number":36,"context_line":"            sa.Table(\u0027alembic_version\u0027, meta, autoload\u003dTrue).drop()"},{"line_number":37,"context_line":"        except sa.exc.NoSuchTableError:"},{"line_number":38,"context_line":"            pass"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAVn%2F%2B%2BU4%3D","line":36,"in_reply_to":"AAAAVn%2F%2B%2BX8%3D","updated":"2014-03-10 23:03:41.000000000","message":"We can. But checkfirst argument defaults to False in both SA 0.9 and SA 0.8. So this shouldn\u0027t be an issue, if it works with SA 0.8 now.","commit_id":"dce3959af2c4b03dff0bd201a428ee9dc8dfc64d"}]}
