【Python基礎】sqlite3:データベース構成や列名の確認

  • URLをコピーしました!
目次

SQLite3

前回、データベース管理システムSQLite3をPythonで使うための基礎を勉強しました。

ただ前回チラッとお話ししましたが、テーブルの存在を確認する「.tables」やデータベースの構成を確認する「.schema」のように「.(ピリオド)」で始まるコマンドは使えないようです。

ということで今回はどんなテーブルが存在するのか、そしてその列名を取得する方法を勉強していきましょう。

まずは今回使用するデータベースを作成します。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    cur.execute("CREATE TABLE table1(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
    cur.execute("INSERT INTO table1(id, name, age) values(1, 'Sato', 10)")
    cur.execute("INSERT INTO table1(id, name, age) values(2, 'Suzuki', 15)")
    cur.execute("INSERT INTO table1(id, name, age) values(3, 'Takahashi', 20)")
    cur.execute("CREATE TABLE table2(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")
    cur.execute("INSERT INTO table2(id, name, age) values(1, 'Tanaka', 25)")
    cur.execute("INSERT INTO table2(id, name, age) values(2, 'Ito', 30)")

「table1」に「id、name、age」という3つの列と「Sato、Suzuki、Takahashi」という3つのデータが入っています。

「table2」にも同様に「id、name、age」という3つの列があり、こちらには「Tanaka、Ito」という2つのデータが入っています。

SELECT文で確認してみましょう。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    data = cur.execute("SELECT * FROM table1").fetchall()
    print(data)

実行結果
[(1, 'Sato', 10), (2, 'Suzuki', 15), (3, 'Takahashi', 20)]
import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    data = cur.execute("SELECT * FROM table2").fetchall()
    print(data)

実行結果
[(1, 'Tanaka', 25), (2, 'Ito', 30)]

確かにそれぞれ意図した通りデータが入っています。

それでは始めていきましょう。

.tables、.shcemaが使えないことの確認

まずは「.tables」、「.schema」が使えないことを確認してみます。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    data = cur.execute(".tables").fetchall()
    print(data)

実行結果
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
Input In [17], in <cell line: 4>()
      4 with sqlite3.connect(dbname) as conn:
      5     cur = conn.cursor()
----> 6     data = cur.execute(".tables").fetchall()
      7     print(data)

OperationalError: near ".": syntax error
import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    data = cur.execute(".schema").fetchall()
    print(data)

実行結果
---------------------------------------------------------------------------
OperationalError                          Traceback (most recent call last)
Input In [18], in <cell line: 4>()
      4 with sqlite3.connect(dbname) as conn:
      5     cur = conn.cursor()
----> 6     data = cur.execute(".schema").fetchall()
      7     print(data)

OperationalError: near ".": syntax error

両方とも「syntax error」、つまり構文エラーが出ました。

そしてその場所は「near “.”」ということなので、やはり「.(ピリオド)」で始まるコマンドが使えないようです。

データベース構成を確認する方法

それではPython上でSQLite3を使う場合にデータベース構成を確認する方法を試していきましょう。

その場合は「sqlite_master」というものを使用します。

この「sqlite_master」がどういうものなのかは詳しくは分かりませんが、「.shema」同様、データベースの構成を保存し、表示するためのテーブルらしいです。

使用方法としてはSELECT文を使い「SELECT * FROM sqlite_master WHERE type=’table’;」とします。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    data = cur.execute("SELECT * FROM sqlite_master WHERE type='table'").fetchall()
    print(data)

実行結果
[('table', 'table1', 'table1', 2, 'CREATE TABLE table1(id INTEGER PRIMARY KEY, name TEXT, 
age INTEGER)'), ('table', 'table2', 'table2', 3, 'CREATE TABLE table2(id INTEGER PRIMARY KEY, 
name TEXT, age INTEGER)')]

ちなみに「sqlite_master」はPythonのsqlite3ライブラリの機能ではなく、SQLite3の機能です。

つまりターミナルでSQLite3のデータベースを操作している時でも使用することが可能です。

その場合はこんな感じです。

sqlite3 test8.db 
sqlite> SELECT * FROM sqlite_master WHERE type='table';

実行結果
table|table1|table1|2|CREATE TABLE table1(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)
table|table2|table2|3|CREATE TABLE table2(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)

列名をリストで取得する方法

「sqlite_master」を使って、データベース構成、つまりどのようなテーブルがあるかと、その列名を取得できましたが、列名に関しては「CREATE TABLE table1(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)」というそのままでは使いにくい形になっています。

どうせなら列名をリストで取得したいものです。

その場合は「cur.execute(“SELECT * FROM テーブル名”)で列名を取得したいテーブルをカーソルに受け渡した後、「cur.description」で取得することが可能です。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    cur.execute("SELECT * FROM table1")
    print(cur.description)

実行結果
(('id', None, None, None, None, None, None), 
('name', None, None, None, None, None, None), 
('age', None, None, None, None, None, None))

それぞれのタプルの1番目が列名になります。

ただこのままではやはり使いにくいので、for文を使ってそれぞれのタプルの1番目だけを取得し、リストに格納すると使いやすくなります。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    cur.execute("SELECT * FROM table1")
    columnnames = []
    for description in cur.description:
        columnnames.append(description[0])
    print(columnnames)

実行結果
['id', 'name', 'age']

ちなみにリスト内包表記を使うともう少しすっきりします。

import sqlite3

dbname = 'test8.db'
with sqlite3.connect(dbname) as conn:
    cur = conn.cursor()
    cur.execute("SELECT * FROM table1")
    columnnames = [description[0] for description in cur.description]
    print(columnnames)

実行結果
['id', 'name', 'age']

ということで構成が不明なデータベースでも存在しているテーブル名やその列名など操作するのに必要な情報を取得できるようになりました。

これでPythonを使ってSQLite3を操作する基礎ができたと思います。

今後はSQLite3を使っていき、必要に応じて勉強していきたいと思います。

次回はリストの集合計算に関して解説していきます。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次