SQLite3
前回、SQLite3のLIKE句によるパターンマッチングを解説しました。
今回はSQLiteでREPLACEを使った文字列の置換を紹介します。
ということでとりあえず今回使用するデータベースを作っていきましょう。
import sqlite3
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
cur.execute('CREATE TABLE test(id INTEGER PRIMARY KEY, fruits TEXT)')
conn.commit()
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
cur.execute('INSERT INTO test(id, fruits) values(0, "Apple")')
cur.execute('INSERT INTO test(id, fruits) values(1, "Banana")')
cur.execute('INSERT INTO test(id, fruits) values(2, "Pineapple")')
cur.execute('INSERT INTO test(id, fruits) values(3, "Peach")')
cur.execute('INSERT INTO test(id, fruits) values(4, "Orange")')
conn.commit()
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
data = cur.execute('SELECT * FROM test').fetchall()
print(data)
実行結果
[(0, 'Apple'), (1, 'Banana'), (2, 'Pineapple'), (3, 'Peach'), (4, 'Orange')]
ということで今回は「Apple」、「Banana」、「Pineapple」、「Peach」、「Orange」の5つのデータをもったデータベースを作成してみました。
REPLACE:SELECT文で置換後の値を取得
文字列を置換するには「REPLACE(対象の列, 変換前の文字列, 変換後の文字列)」を使います。
ということで試してみましょう。
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
data = cur.execute('SELECT *, replace(fruits, "a", "A") FROM test').fetchall()
print(data)
実行結果
[(0, 'Apple', 'Apple'), (1, 'Banana', 'BAnAnA'), (2, 'Pineapple', 'PineApple'),
(3, 'Peach', 'PeAch'), (4, 'Orange', 'OrAnge')]
これをどうやら新しい列を作成し、そこに置換後(今回は「a」を「A」に置換)の値が入っているように見えます。
このままもう一度データベースを開き直し、置換されているのか確認してみましょう。
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
data = cur.execute('SELECT * FROM test').fetchall()
print(data)
実行結果
[(0, 'Apple'), (1, 'Banana'), (2, 'Pineapple'), (3, 'Peach'), (4, 'Orange')]
「a」が「A」に置換されていません。
実はこの方法ではデータベースは置換されません。
問題は「’SELECT *, replace(fruits, “a”, “A”) FROM test’」にあります。
この書き方では「testのテーブルのデータ全て(*)とfruitsの列の「a」を「A」に変換した列を取得」するとなってしまいます(SELECT文なので)。
結構これで置換できると書いているウェブサイトもあるのですが、データベースの値としての文字列を置換するには「UPDATE文」を使います。
REPLACE:UPDATE分でデータベースの値を置換
UPDATE文を使ってデータベースの値を置換するには「UPDATE テーブル名 SET 列名=REPLACE(列名, 置換前の値, 置換後の値)」とします。
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
cur.execute('UPDATE test SET fruits=REPLACE(fruits, "a", "A")')
data = cur.execute('SELECT * FROM test').fetchall()
print(data)
[(0, 'Apple'), (1, 'BAnAnA'), (2, 'PineApple'), (3, 'PeAch'), (4, 'OrAnge')]
with sqlite3.connect('test2.db') as conn:
cur = conn.cursor()
data = cur.execute('SELECT * FROM test').fetchall()
print(data)
実行結果
[(0, 'Apple'), (1, 'BAnAnA'), (2, 'PineApple'), (3, 'PeAch'), (4, 'OrAnge')]
確かにデータベースの値がちゃんと置換されています。
ということでREPLACE句で置換はできるけども、SELECT文を使うか、UPDATE文を使うかでデータベースに反映されるか変わりますので注意しましょう。
次回はMacでスクリーンショットを撮ったりするためにデスクトップのフォルダやファイルを隠すアプリ「HiddenMe」を紹介します。
ではでは今回はこんな感じで。
コメント