Cucco’s Compute Hack

コンピュータ関係の記事を書いていきます。

DBのテーブルから列データをリストで取得する

DBのテーブルから列データをリストで取得する。fetch()で取得すると、行ごとのタプルのリストになっていて、処理しづらいので、ほしい列の値だけをリストにする関数get_one_column_data_list()を作成。
リストのメモリ確保のため、件数確認のget_countも作成。

get_one_column_data_list()は、リスト化したときの順番をソート済みで取得することも可能。

プログラム
import sqlite3
import random
from faker import Faker

def get_count(database, table_name):
    cur = database.cursor()
    sql_count = "SELECT COUNT (*) FROM {0}".format(table_name)
    d = cur.execute(sql_count).fetchone()
    # dは、(100,)のような形になっている
    cur.close()
    return d[0]

def get_one_column_data_list(database, table_name, column_name, target_column_index=0, column_orderby=None):
    data_size = get_count(database, "data")
    data_list = [None]*data_size

    if column_orderby == None:
        sql_select = "SELECT {0} FROM {1}".format(column_name, table_name)
    else:
        sql_select = "SELECT {0} FROM {1} ORDER BY {2} asc".format(
            column_name, table_name, column_orderby)

    cur = database.cursor()
    d = cur.execute(sql_select)

    for index, row in enumerate(d):
        data_list[index] = row[target_column_index]

    cur.close()

    return data_list

if __name__ == "__main__":

    con = sqlite3.connect(":memory:")
    con.isolation_level = None  # None で自動コミットモード
    cur = con.cursor()
    cur.execute('PRAGMA temp_store=MEMORY;')
    cur.execute('PRAGMA journal_mode=MEMORY;')

    sql_create_table = "CREATE TABLE data(number INTEGER UNIQUE, name TEXT, score REAL)"
    sql_instert_data = "INSERT INTO data VALUES(?,?,?)"

    fake = Faker()
    listsize = 8
    list_data = [None] * listsize

    print("データ準備 開始")
    for i in range(listsize):
        list_data[i] = [i, fake.name(), random.random()]
        print(list_data[i])
    print("データ準備 完了")

    cur.execute(sql_create_table)
    cur.executemany(sql_instert_data, list_data)

    table_name = "data"
    column_name = "score"
    column_orderby = "name"

    data_list = get_one_column_data_list(
        con, table_name, column_name, target_column_index=0, column_orderby=column_orderby)

    print(data_list)
実行結果
>python C:\dev\SampleCodes\hello_sqlite\select_one_col.py
データ準備 開始
[0, 'Taylor Smith', 0.6560666934413109]
[1, 'Jesse Carrillo', 0.9199740526758551]
[2, 'Tina Gonzalez', 0.8344908595983038]
[3, 'Richard Mckinney', 0.1240783472168423]
[4, 'Victoria Pace', 0.25291942565400816]
[5, 'Steven Craig', 0.0703249952634678]
[6, 'Valerie Mitchell', 0.0015255246599048533]
[7, 'Victoria Hill', 0.9645617001034171]
データ準備 完了
[0.9199740526758551, 0.1240783472168423, 0.0703249952634678, 0.6560666934413109, 0.8344908595983038, 0.0015255246599048533, 0.9645617001034171, 0.25291942565400816]