0

データベース内のすべてのテーブルを削除したいdb。私がしていることは、反復しdb.tablesて 1 つずつドロップすることだけです。ただし、一部のテーブルは無視されるため、削除されません。次に、すべてのテーブルが切り捨てられるように変更dropしました。truncateそれで、何が問題なのdropですか?

コードは次のとおりです。

コントローラー/admin.py:

def olddo_remove():
    response.view = 'admin/do_remove.html'
    l = []
    k = []
    for table_name in db.tables:
        l.append(table_name)
        db[table_name].drop()
        #db[table_name].truncate()
    return locals()

def do_remove():
    l = []
    k = []
    for table_name in db.tables:
        l.append(table_name)
    for table_name in l:
        k.append(table_name)
        db[table_name].drop()
    return locals()

ビュー/管理者/do_remove.html:

{{=l}}<br />{{=k}}

admin/olddo_remove にアクセスすると、

['auth_user', 'auth_membership', 'auth_event', 'client', 'data']
[] 

admin/do_remove にアクセスすると、

['auth_user', 'auth_group', 'auth_membership', 'auth_permission', 'auth_event', 'auth_cas', 'client', 'product', 'data']
['auth_user', 'auth_group', 'auth_membership', 'auth_permission', 'auth_event', 'auth_cas', 'client', 'product', 'data'] 

olddo_remove でdroptoを変更すると、出力は次のようになります。truncate

['auth_user', 'auth_group', 'auth_membership', 'auth_permission', 'auth_event', 'auth_cas', 'client', 'product', 'data']
[] 

なんで?どうしたの?


これはクレイジーです!!

def test():
    response.view = 'admin/do_remove.html'
    l = db.tables
    k = []
    for table_name in l:
        k.append(table_name)
        db[table_name].drop()
    return locals()

出力:

['auth_group', 'auth_permission', 'auth_cas', 'product']
['auth_user', 'auth_membership', 'auth_event', 'client', 'data'] 

そして、2 行目のテーブルのみが削除されました。

4

1 に答える 1

2

これは Python の問題です。db.tablesリスト オブジェクトです (実際には、リストから継承する特別な SQLCallableList オブジェクトです)。db[table_name].drop()データベースから table_name テーブルを削除するだけでなく、db.tablesリストから table_name も削除します。したがって、for ループでは、リストを繰り返し処理し、繰り返しながらそのリストを変更します (つまり、リストから項目を削除します)。これが、他のすべてのテーブルのみを取得する理由です。動作する例では、最初にリストをコピーしてからコピーを反復処理しているため (ループ内で変更されていません)、期待どおりに動作します。db.tables切り捨ては (データベースまたは から) テーブルを削除しないため、直接反復処理を行う場合でも切り捨ては機能しますdb.tables

前述のとおり、db.tablesSQLCallableList であることに注意してください。つまりdb.tables()、リストのコピーが返されるdb.tablesため、代わりにコピーを反復処理できます。

for table_name in db.tables():
    db[table_name].drop()

.drop() は table_name を削除しますが、for ループが反復しているコピーdb.tablesからは削除しないため、すべてが期待どおりに機能するはずです。db.tables()

于 2012-07-28T20:26:37.783 に答える