データが100件以上になったら自動で1件削除したい。という要件定義を実装におとしこみましたのでサンプルコードを公開したいと思います。
環境は以下です。
- pythonのsqlite3をつかっている
- すでにデータベースは作成されているものとする(なくても接続の時点で作られたきがします。)
100件たまったら最初の1件を削除するサンプルコード
import sqlite3, random
def create_name():
ary = ["a","b","c","e","f","g","h","i","j","k","l","m","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
name = ""
for i in range(10):
name += random.choice(ary)
return name
def choice_gender():
ary = ["man", "fimale"]
gender = random.choice(ary)
return gender
def table_action(count):
if count == 0:
for i in range(100):
c.execute('insert into users4(name, gender) values (?,?)', (create_name(), choice_gender()))
elif count >= 100 and count < 300:
c.execute('delete from users4 where id = ?', (data_first(),))
elif count >= 300:
c.execute('delete from users4')
def data_first():
sql = 'select * from users4 limit 1'
for row in c.execute(sql):
return str(row[0])
def print_table():
sql = 'select * from users4'
for row in c.execute(sql):
print(row)
conn = sqlite3.connect('database.sqlite')
c = conn.cursor()
c.execute('create table if not exists users4(id integer primary key autoincrement, name text, gender text)')
count = c.execute('select count (*) from users4')
count = count.fetchall()[0][0]
table_action(count)
conn.commit()
print_table()
conn.close()
われながら結構ひどいコードです。
プログラムの解説
create_name関数
create_name関数はrandomモジュールを使って10文字のランダムな名前を生成します。とりあえずデータを作ってテストしたいときにすぐ使える関数です。
自分で作らなくてもライブラリとかあった気がしますが、ほかのをつかうのもめんどうなことがあるのでとりあえず作りました。
choice_gender関数
choice_gender関数は見ての通り、性別が man か femaleかをランダムにえらんで返す関数です。まとめると性別を返す関数です
table_action関数
table_action関数はレコードの件数によって処理を分岐させるために作った関数です。
もしusersテーブルのレコードが0件ならばcreate_name関数とchoice_gender関数をつかって100件分のデータを作成します。
もしレコードの件数が100件以上300未満のときは最初の1件を削除します。この処理にはdata_firstという関数を使っています。
delete from users limit 1はerrorになる
data_first関数は最初の1件を指定する(見つけ出す)関数ですが、これを作った理由としては、sqlite3はなぜか delete from users limit 1とするとエラーになってしまうのです。エラーになる原因が、文法によるものなのか、それとも他に原因があるのかはわたしにはわかりませんでした。
まあとにかく動けばいいということで、普通にselect文で検索して最初の1件を抜き出せばごり押しでいけちゃいますね。しかしpythonのsqlite3では値の埋め込み時にタプルがでてきたりしておもいのほかややこしいので、結構頭を使います。
このプログラムを流用すればいろいろできそうです。

コメント