# 【DB作成】PythonのSqlite3を使ってデータベースを操作する方法を見ていこう！

> 当サイト【スタビジ】の本記事では、PythonのSqlite3を使ってデータベース操作をおこなっていきます。PythonでSQL扱えると便利！もちろんPythonだけでなくSQLの知識も必要になるので注意してくださいねー！

- URL: https://toukei-lab.com/python-sqlite3
- 公開: 2022.11.29 / 更新: 2025.01.06
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、PythonのSqlite3を使ってデータベース操作をおこなっていきます。PythonでSQL扱えると便利！もちろんPythonだけでなくSQLの知識も必要になるので注意してくださいねー！
:::

こんにちは！

データサイエンティストでありながら最近はWeb開発に没頭しているウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です。

Pythonでデータベースを作成して操作することができるのをご存知でしょうか？

もちろん[SQL](/sql%e3%82%aa%e3%82%b9%e3%82%b9%e3%83%a1%e6%9c%ac)の知識もある程度必要ですが、<mark>Pythonのsqlite3というライブラリを使えば簡易的にデータベース使えちゃいます。</mark>

是非、マスターしておきましょう！

:::talk{who="umatan"}
PythonとSQLを用いてデータベース作成・操作していこう！
:::

この記事ではPythonのsqlite3を用いてデータベースを作成する方法について見ていきます。

## Pythonでデータベースを扱えるsqlite3とは

sqlite3はpythonでデータベースを操作するライブラリです。

基本的な記述方法はSQLが分かっていれば問題ありません。ちなみにMySQLをPythonで使う方法もあります。

sqlite3のリファレンスに関して詳細は以下のURLをご覧ください！

<https://docs.python.org/ja/3.5/library/sqlite3.html>

## Python　Sqlite3の使用方法

![](/wp-content/uploads/2018/09/goriIMGL9703_TP_V1-e1555747456954.jpg)

Sqlite3で簡単に<mark>データベースを作成し、テーブルにデータを格納し抽出</mark>してみます。

コードは以下のようになっています。

```python title="sqlite.py"
import sqlite3

dbname = 'trains.db'

conn=sqlite3.connect(dbname)
c = conn.cursor()

# executeメソッドでSQL文を実行する
create_table = 'create table toukeilab (id value,name verchar)'
c.execute(create_table)

# SQL文に値をセットする場合は，Pythonのformatメソッドなどは使わずに，
# セットしたい場所に?を記述し，executeメソッドの第2引数に?に当てはめる値をタプルで渡す．
sql = 'insert into toukeilab (id, name) values (?,?)'
namelist = (1, "uma")
c.execute(sql, namelist)

conn.commit()

select_sql = 'select * from toukeilab'

c.execute(select_sql)
result=c.fetchone()

conn.close()

print(result)
```

:::talk{who="robotan"}
うわ！たくさんコードがあって理解が難しそう、、、
:::

:::talk{who="umatan"}
大丈夫！順番に説明していくよ！
:::

### データベースを作成

```python
import sqlite3

dbname = 'trains.db'

conn=sqlite3.connect(dbname)
c = conn.cursor()
```

こちらの部分でデータベースを作成しています。conn.cursor()はデータベースに接続するためのおまじないだと思っていただければ問題ございません。

### テーブルを作成

```python
# executeメソッドでSQL文を実行する
create_table = '''create table toukeilab (id value,name verchar)'''
c.execute(create_table)
```

こちらで、テーブルを作成しています。テーブル上の列名を型と同時に定義します。

この時、テーブルが既に存在する場合エラーを起こしてしまうので、もしテーブルが存在する場合はテーブルを作成しないという処理を入れる必要があります。

また複数のSQL文処理を行う場合は、executeではなくexecutescriptを使う必要があります。

これらに関しては後述します。

### テーブルにデータを格納

```python
sql = 'insert into toukeilab (id, name) values (?,?)'
namelist = (1, "uma")
c.execute(sql, namelist)

conn.commit()
```

こちらでテーブルにデータを格納していきます。

conn.commit()ではデータの格納を保存します。

### データを抽出

```python
select_sql = 'select * from toukeilab'

c.execute(select_sql)
result=c.fetchone()

conn.close()

print(result)
```

こちらの部分で格納したデータを抽出していきます。

fetchoneではデータを1行抽出します。

conn.close()では、データベースへの接続を止めます。

これで<mark>簡単なデータベース作成・操作方法は終了。</mark>

続いて他のコードと組みあわせて、少し応用した実装を行っていきましょう！

## Pythonで応用的なコードを実装

![](/wp-content/uploads/2018/09/S_8608589564326-1024x768.jpg)

今回実装したいのは、<mark>ある記事情報をスクレイピングで抽出しそれらの類似度を計算した後、抽出に使ったURLと類似度をデータベースに格納して抽出する</mark>というもの。

実際にはデータベースを経由する必要はありませんが、勉強のためSqlite3を使ってみましょう。

ちなみにスクレイピングと類似度算出に関しては以下の記事でまとめているので参考にしてみてください。

:::related
■[Pythonのbeautifulsoupでスクレイピングを実装してみよう！](/python-scraping)\
■[PythonのMeCabで形態素解析！文書の類似度を算出してみよう！](/python-mecab)
:::

コードは以下のようになっています。

```python title="machrate-sqlite3.py"
import requests
from bs4 import BeautifulSoup
import sys
import MeCab
from time import sleep
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
import sqlite3


def geturl(urls):
    all_text=[]
    for url in urls:
        r=requests.get(url)
        c=r.content
        soup=BeautifulSoup(c,"html.parser")
        article1_content=soup.find_all("p")
        temp=[]
        for con in article1_content:
            out=con.text
            temp.append(out)
        text=''.join(temp)
        all_text.append(text)
        sleep(1)
    return all_text

def mplg(article):
    word_list = ""
    m=MeCab.Tagger()
    m1=m.parse (text)
    for row in m1.split("\n"):
        word =row.split("\t")[0]#タブ区切りになっている１つ目を取り出す。ここには形態素が格納されている
        if word == "EOS":
            break
        else:
            pos = row.split("\t")[1]#タブ区切りになっている2つ目を取り出す。ここには品詞が格納されている
            slice = pos[:2]
            if slice == "名詞":
                word_list = word_list +" "+ word
    return word_list

def tfidf(word_list):
    docs = np.array(word_list)#Numpyの配列に変換する
    #単語を配列ベクトル化して、TF-IDFを計算する
    vecs = TfidfVectorizer(
                token_pattern=u'(?u)\\b\\w+\\b'#文字列長が 1 の単語を処理対象に含めることを意味します。
                ).fit_transform(docs)
    vecs = vecs.toarray()
    return vecs


def cossim(v1,v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

##データベースの
class Db():
    def __init__(self,dbname):
        self.db=dbname

    def db_input(self,article):
        #値をデータベースに格納
        conn=sqlite3.connect(self.db)
        c = conn.cursor()
        # executeメソッドでSQL文を実行する
        create_table = '''DROP TABLE IF EXISTS article_match;
                        create table article_match (text_1 verchar,text_2 verchar,match_rate double)'''
        c.executescript(create_table)
        # セットしたい場所に?を記述し，executeメソッドの第2引数に?に当てはめる値を
        # タプルで渡す．
        sql = 'insert into article_match (text_1, text_2, match_rate) values (?,?,?)'
        c.execute(sql, article)
        conn.commit()
        c.close()
        conn.close()

    def db_output(self):
        #データベースから値を抽出
        conn=sqlite3.connect(self.db)
        c = conn.cursor()
        select_sql = 'select * from article_match'
        c.execute(select_sql)
        match_rate=c.fetchone()
        conn.commit()
        c.close()
        conn.close()
        return match_rate

word_list=[]
url=["https://toukei-lab.com/conjoint","https://toukei-lab.com/correspondence"]
texts=geturl(url)
for text in texts:
    word_list.append(mplg(text))
    
vecs=tfidf(word_list)
match_rate=cossim(vecs[1],vecs[0])
article = (url[0], url[1], match_rate)
dbname = 'article.db'
db=Db(dbname)
db.db_input(article)
article=db.db_output()

article[2]
```

前半部分では**スクレイピング・形態素解析・類似度算出**を行う関数を定義しています。

その後データベース格納から抽出まで行うクラスを定義し、その中で関数を定義しています。

基本的に先ほどと変わりませんが、テーブルが既に存在する場合は消去し新たにテーブルを定義するSQL文を作成しています。

そのSQL文を実行する際はexecutescriptを使っています。

<mark>各URLに紐づくテキストの類似度をデータベースに蓄積していくなどを行うことが可能ですね！</mark>

## Pythonでデータベース操作　まとめ

ここまでご覧いただきありがとうございます！

本記事では、**Pythonでデータベースを操作する方法**について見てきました。

この記事では簡易的なSQL文についてのみ見てきましたが、<mark>SQL文を使えば様々なデータを作成・抽出・加工することができます。</mark>

以下の記事でSQL文の簡単な構文についてまとめていますのでよければご覧ください！

<https://toukei-lab.com/sql-select%E6%96%87>

Pythonはデータ解析やスクレイピングそしてWebアプリケーション作成まで出来る幅広いプログラミング言語！

Pythonでできることは以下にまとめています！

<https://toukei-lab.com/python-can>

また以下の記事で初心者がPythonを習得する方法・SQLを習得する方法についてまとめていますのでよければご覧ください！

<https://toukei-lab.com/python-learn>

<https://toukei-lab.com/sql%E3%82%AA%E3%82%B9%E3%82%B9%E3%83%A1%E6%9C%AC>

また、データベース・データマネジメント周りの知識を体系的に付けたい人は以下の記事もしくはUdemy講座でまとめていますので是非見てみてください！

<https://toukei-lab.com/dmbok-datamanagement>

[**【初学者向け】データマネジメント入門！DX推進やAI 導入を支える重要な要素をDMBOKに沿ってみていこう！**](https://www.udemy.com/course/data-management/?referralCode=A21064F4208E16FF5843)

[![Udemy　データマネジメント講座](/wp-content/uploads/2020/12/Udemy-me5-min-1024x550.jpg)](https://www.udemy.com/course/data-management/?referralCode=A21064F4208E16FF5843)

<table class="table">
<tbody>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【時間】</th>
<td><span>1.5時間</span></td>
</tr>
</tbody>
</table>

自分で言うのもなんですが、データマネジメントについてDMBOKに沿ってこれでもかというくらい分かりやすくまとめているつもりです！

::button[このコースを見てみる]{href="https://www.udemy.com/course/data-management/?referralCode=A21064F4208E16FF5843" note="＼30日以内なら返金無料／"}