2014年6月29日日曜日

[Python][SQLite]データ登録後 Commit を不要にする

DB を開く時に isolation_level=None を指定することでデータ登録後に Commit を実行する必要がなくなる。
con = sqlite3.connect("data.db", isolation_level=None)

[Python][SQLite]使い方

Python 2.5 から SQLite3 が標準で使えるようになっている。
# -*- coding: utf-8 -*-
import sqlite3

needCommit = 0

# Database を開く
if needCommit == 1:
    con = sqlite3.connect("data.db");
else:
    con = sqlite3.connect("data.db", isolation_level=None); # Commit 不要

# Table 作成
sql = u"CREATE TABLE test(ID INT PRIMARY KEY, NAME TEXT NOT NULL);"
con.execute(sql)

# データ登録
sql = u"INSERT INTO test(ID, NAME) values (0, 'aaa');"
con.execute(sql)

# データ登録 その 2
sql = u"INSERT INTO test(ID, NAME) values (?, ?);"
con.execute(sql, (1, "bbb"))
con.execute(sql, (2, "ccc"))

if needCommit == 1:
    con.commit()

# レコード取得
c = con.cursor()
c.execute("SELECT * FROM test")
for row in c:
    print row[0], row[1]

# Database を閉じる
con.close();
実行結果
> python sqlite.py
0 aaa
1 bbb
2 ccc
各処理を関数化、テーブルが作成済みの場合は最初に drop する処理を追加
# -*- coding: utf-8 -*-
import sqlite3

# Database を開く
def connectDb():
    print "Connect DB"
    con = sqlite3.connect("data.db", isolation_level=None);
    return con

# Table 作成
def createTable(con, name):
    print "Create table";
    sql = "CREATE TABLE %s(ID INT PRIMARY KEY, NAME TEST NOT NULL);" % name
    con.execute(sql)

# データ登録
def addData(con, id, name):
    print "Add data (%d %s)" % (id, name)
    sql = "INSERT INTO test(ID, NAME) values(%d, '%s');" % (id, name)
    print sql;
    con.execute(sql)

# 全レコード表示
def showAllRecord(con):
    c = con.cursor()
    c.execute("SELECT * FROM test")
    for row in c:
        print row[0], row[1]

# Database を閉じる
def closeDb(con):
    print "Close database"
    con.close()

# テーブル一覧表示
def showAllTables(con):
    c = con.cursor()
    c.execute("SELECT NAME FROM sqlite_master WHERE type='table'")
    for row in c:
        print row[0]

# テーブル作成済みか確認
def alreadyCreatedTable(con, name):
    c = con.cursor()
    c.execute("SELECT NAME FROM sqlite_master WHERE type='table'")
    for row in c:
        if row[0] == name:
            print "Found %s" % name;
            return 1
    return 0

# Drop table
def dropTable(con, name):
    print "Drop table %s" % name
    sql = "DROP TABLE %s;" % name
    con.execute(sql)

# メイン処理
con = connectDb()
showAllTables(con)
if alreadyCreatedTable(con, 'test') == 1:
    dropTable(con, 'test')
    createTable(con, 'test')

showAllTables(con)
alreadyCreatedTable(con, 'test')

addData(con, 0, 'aaa')
addData(con, 1, 'bbb')
addData(con, 2, 'ccc')

showAllRecord(con)
closeDb(con)
実行結果
> python sqlite2.py
Connect DB
Create table
test
Found test
Add data (0 aaa)
INSERT INTO test(ID, NAME) values(0, 'aaa');
Add data (1 bbb)
INSERT INTO test(ID, NAME) values(1, 'bbb');
Add data (2 ccc)
INSERT INTO test(ID, NAME) values(2, 'ccc');
0 aaa
1 bbb
2 ccc
Close database

> python sqlite2.py
Connect DB
test
Found test
Drop table test
Create table
test
Found test
Add data (0 aaa)
INSERT INTO test(ID, NAME) values(0, 'aaa');
Add data (1 bbb)
INSERT INTO test(ID, NAME) values(1, 'bbb');
Add data (2 ccc)
INSERT INTO test(ID, NAME) values(2, 'ccc');
0 aaa
1 bbb
2 ccc
Close database

[Python]FTP - カレントディレクトリのファイルをアップロードする

ソースコード
# -*- coding: utf-8 -*-
import os
import re
import ftplib

# カレントディレクトリのファイルをアップロードする

## Upload files
def uploadFiles(top, exp):
    for filename in os.listdir(top):
        if re.search(exp, filename):
            print top + filename
            f = file(filename, 'rb')
            ftp.storbinary('STOR ' + filename, f)
            f.close()

# カレントディレクトリのファイル一覧を取得
user='username'
password='password'
server='servername'

currentDir = ''
dstDir = ''

ftp = ftplib.FTP(server)
ftp.login(user, password)
uploadFiles('./', 'txt$')

ftp.quit()
実行結果
> python test02.py
./test.txt
./test02.txt
./test03.txt

[Python]FTP - サーバーにファイルを置く

ソースコード
# -*- coding: utf-8 -*-
import ftplib

# サーバーにファイルを置く (STOR)
user='username'
password='password'
server='servername'
filename='test.txt'

ftp = ftplib.FTP(server)
ftp.login(user, password)
f = file(filename, 'rb')
ftp.storbinary('STOR ' + filename, f)
f.close()
ftp.quit()
実行結果
> python test01.py

[Python]FTP - サーバーログイン/ログアウト

ソースコード
# -*- coding: utf-8 -*-
import ftplib

# サーバーにログインしファイルリストを取得する (LIST)
user='username'
password='password'
server='servername'

ftp = ftplib.FTP(server)
ftp.login(user, password)
ftp.retrlines('LIST')
ftp.quit()
実行結果
> python test00.py
drwxr-xr-x  19 username 503          4096 Sep 14 11:44 .
drwxr-xr-x  19 username 503          4096 Sep 14 11:44 ..
-rw-r--r--   1 username 503          4802 Sep 14 11:45 index.html

[MySQL][Python]MySQLdb

使い方 データ挿入 (INSERT) 後は commit しないと DB に登録されないので注意。
# -*- coding:utf-8 -*-
import MySQLdb

# DB に接続
db = MySQLdb.connect(user="user", passwd="password", db="test", charset="utf8")

# SELECT
db.query("SELECT * FROM score")
result = db.store_result()

# 表示
num = result.num_rows()
for row in result.fetch_row(num):
    print row

    # INSERT
    q = "INSERT INTO `test`.`score` (`id`, `user_id`, `score`)"
    q += " VALUES (NULL, '1', '97');"
    print "%s" % (q)
    db.query(q)

    # データ挿入後は commit
    db.commit()

# Close
db.close()