2016-06-13 4 views
-4

私はPython /フラスコのWebサイトを構築していますが、これまでのところ動作しますが、実際にはcount(id)キー)、私はランダムにいくつかの行を削除することはできません。python SQLite3の行IDを1行取り除くときに行番号を更新する

リストのように1行を削除するときに、より高いIDを更新する最も良い方法は誰にも分かりますので、count()とidが一致します。 (最初のID = 1なので、更新なしで完全に一致するはずです)。

スタンドアロンスクリプトに更​​新機能を入れて、巨大なテーブルには重すぎる場合は手動で実行できます。

+0

'カウント(ID) '配列内のギャップに影響されない以下のコードでrenumber()関数を考えます。より高いIDを更新していないという問題は、正確には何と思いますか? –

+0

関連:http://stackoverflow.com/questions/14023292/how-to-get-rownum-like-column-in-sqlite-iphone/19199219#19199219 –

+0

私の問題は、count(id)が正しくないという事実です。行IDの影響を受けます。それは私が望むので、それのようにうまくいくのですが、テーブル内のすべての上位IDの発生を更新する方法を知りたかったので、IDはカウント(IDが不足していません)と等しくなり、テーブルシーケンスを更新します。 – Artemis

答えて

0

キーの連続番号を再作成する方法の1つは、テーブルを削除して再構成することです。

import sqlite3 
from pprint import pprint 

schema = ''' 
    create table S (
     id integer primary key autoincrement not null, 
     content text not null)''' 
def init(db): 
    db.execute('drop table if exists S') 
    db.execute(schema) 
    db.execute('insert into S (content) VALUES ("one")') 
    db.execute('insert into S (content) VALUES ("two")') 
    db.execute('insert into S (content) VALUES ("three")') 
    db.execute('insert into S (content) VALUES ("four")') 
    db.commit() 

def dump(db): 
    for row in db.execute('select * from S order by ID'): 
     print row 
    print 

def renumber(db): 
    # To reorganize the primary key, create a new table 
    db.execute('create temp table temp_S as select content from S order by id') 
    db.execute('drop table S') 
    db.execute(schema) 
    db.execute('insert into S (content) ' 
       ' select content from temp_S order by rowid') 
    db.commit() 


db = sqlite3.connect(':memory:') 
init(db) 
dump(db) 
db.execute('delete from S where id in (1,3)') 
db.commit() 
dump(db) 
renumber(db) 
dump(db) 

結果:

(1, u'one') 
(2, u'two') 
(3, u'three') 
(4, u'four') 

(2, u'two') 
(4, u'four') 

(1, u'two') 
(2, u'four') 
関連する問題