PythonでSQLite 備忘録
pythonとSQLite勉強中。個人的なメモです。
わからないところもあるまま書いているので
参考にならないかと思います。。。
SQLiteは動作が軽いらしい。
Mysqlの方が同時接続に強いらしい。
SQLiteでできるようになったこと
テーブルの作成、rowとcolumnの作成。
columnの指定とrowの最終行を指定すること。
セルを指定して書き込み、読み込み
DB Browser for SQLite
DB Browser for SQLiteというフリーのアプリケーションでデータベースを確認しながら作業するとわかりやすかった。
これが使いやすいのでSQLiteを使うことにした。
データベースがロックされるとき
DB Browser for SQLiteでデータベースを開いて
書き換えなどして保存をしようとしたときに
pythonからもデータベースに書き込みしようとすると
' database is locked 'と言われて怒られる。
データベースファイルをコピーして、コピーで新しくできたファイルを元の名前に変えるとだいたい解決する。
ちょっとハマったこと
time.sleep(n)で止まる。
原因はメインスレッドでループをしていないのに
別スレッドでループをさせたときに起こった。
モジュールを読み込む
import sqlite3
#デフォルトで入っているのでインストールは必要ない。
データベースとその中のテーブルの作成
myDB = '../../datebase/myDB.db' #ディレクトリを指定
connect_db = sqlite3.connect(myDB) #これで接続
cur = connect_db.cursor() #カーソルオブジェクトを作成
cur.execute('CREATE TABLE mytable(id INT,name TEXT, date datetime, price REAL)')
データ型datetimeの意味がわからなかった。
すでに作成済みのデータベースに接続する
myDB = '../../datebase/myDB.db' #ディレクトリを指定
connect_db = sqlite3.connect(myDB) #これで接続
SQLiteを操作するカーソルオブジェクトを作成
cur = connect_db.cursor()
テーブルを作成
cur.execute(' CREATE TABLE mytable (id INTEGER ,name TEXT, date datetime) ')
これでcurで接続されているデータベースのmytableというテーブルを作成して
さらにその中にはid、pair, dateという三つのカラム(列)を作った
それぞれのカラムのデータ型も指定してある。カラムに対してデータ型を指定するの必要はない。
それぞれ INTEGER , TEXT , DATETIME 型になっている、書くときは大文字小文字どちらでも機能する。DATETIME型って使えるのかまだわからない。
データ型
NULL :pythonでいうnone
INTEGER or INT :pythonでいうint
REAL :pythonでいうfloat
TEXT :pythonでいうstr
BLOB Binary Large OBject。入力データをそのまま格納する。
変数を使った書き込み ? を使う
データベースへの接続と、カーソルオブジェクトの作成までしておく。
hensu = '変数の中身'
cur.execute( "INSERT INTO mytable(id, sample) values(?,?)",[1,hensu])
connect_db.commit() # データベースへコミット。これで変更が反映される。
connect_db.close() # データベースへのコネクションを閉じる。(必須)
mytableというテーブルのidというカラムに1を新規に書き込み、
sampleというカラムに’変数の中身’というTEXTを
hensuという変数を介して新規に書き込む。
更新する 変数を使って。SQL命令文も変数化。
sql_text = "UPDATE mytable SET hensu = ? where id = ?" #SQL命令文
hensu = '変数の中身' #書き込むデータ1
next_id = 2 #書き込むデータ2
data = (hensu, next_id) #(書き込むデータ1,書き込むデータ2)
cur.execute(sql_text, data) #命令文()の中に上記の変数ふたつ。sql_text と data
connect_db.commit() # データベースへコミット。これで変更が反映される。
connect_db.close() # データベースへのコネクションを閉じる。
データベースから値を抽出
データベースへの接続と、カーソルオブジェクトの作成までしておく。fetchone()を使用でひとつ取り出した。
取り出すときはcur.fetchone()[0]この形。
なぜ [0] がいるのかわからない。。。
タプルの0番目の指定で、やっと使用できる形になる。
cur.execute( " select カラム名 from テーブル名 where id = 1 ; ")|
#whereで絞り込める これなしだとタプルでカラムの中身全部の取得になる。(fetchall使用で)
print(cur.fetchone()[0])
# データベースへのコネクションを閉じる。
connect_db.close()
データベースから値を取得 変数を使って
データベースへの接続と、カーソルオブジェクトの作成までしておく。
fetchone()を使用でひとつ取り出した。
取り出すときはcur.fetchone()[0]この形。なぜかはわからない。
タプルの0番目の指定で、やっと使用できる形になった。
なぜ [0] がいるのかわからない。。。
cur.execute( " select カラム名 from テーブル名 where id = ? ; ")|
#whereで絞り込める これなしだとタプルで全部取得になる。
hensu = 1
cur.execute( " select pair from no1 where id = ? ; ",[hensu])
print(cur.fetchone()[0])
print(cur.fetchone()[0])
# データベースへのコネクションを閉じる。(必須)
connect_db.close()
コーヒー飲みます。ありがとうございます。