<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SQLite</title>
	<atom:link href="https://javeo.jp/tag/sqlite/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Sat, 06 Sep 2025 00:51:46 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2025/08/cropped-ExcelPython_future-32x32.jpg</url>
	<title>SQLite</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】スクレイピングに向けてSQLite3を使いこなそう</title>
		<link>https://javeo.jp/python-sqlite3/</link>
					<comments>https://javeo.jp/python-sqlite3/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 09 Feb 2025 22:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=2685</guid>

					<description><![CDATA[目次 SQLiteとはSQLiteを利用するための準備データ型値のデータ型についてカラムのデータ型についてPythonで実際に使ってみるdb接続（≒ファイル作成）テーブル削除と作成データの作成（挿入）データの取得データの [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p>Pythonでスクレイピングをする時にデータベースがあると色々楽でして、MySQL（MariaDB）やMicrosoft&nbsp;SQL Serverなど機能的にも優れたメジャーなデータベースを使うのもいいですが、個人利用かつ一時利用にはオーバースペック気味なのでお手軽使えるSQLiteの利用方法をご紹介します</p>



<p>&#8220;Pythonで使うため&#8221;前提なのであまり深堀はしませんが、シンプルかつ軽量なので初めてのデータベースにはオススメです</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">SQLiteとは</a></li><li><a href="#toc2" tabindex="0">SQLiteを利用するための準備</a></li><li><a href="#toc3" tabindex="0">データ型</a><ol><li><a href="#toc4" tabindex="0">値のデータ型について</a></li></ol></li><li><a href="#toc5" tabindex="0">カラムのデータ型について</a><ol><li><a href="#toc6" tabindex="0">Pythonで実際に使ってみる</a><ol><li><a href="#toc7" tabindex="0">db接続（≒ファイル作成）</a></li><li><a href="#toc8" tabindex="0">テーブル削除と作成</a></li><li><a href="#toc9" tabindex="0">データの作成（挿入）</a></li><li><a href="#toc10" tabindex="0">データの取得</a></li><li><a href="#toc11" tabindex="0">データの削除</a></li><li><a href="#toc12" tabindex="0">データの更新</a></li><li><a href="#toc13" tabindex="0">同時に削除＆挿入 or 挿入＆更新</a></li><li><a href="#toc14" tabindex="0">全部をまとめたサンプルソース</a></li></ol></li></ol></li><li><a href="#toc15" tabindex="0">あとがき</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">SQLiteとは</span></h2>



<p>SQLiteはMySQL（MariaDB）やMicrosoft&nbsp;SQL Serverと同じでRDBMS（データベース管理システム）で、その名の通り軽量でオープンソースのデータベースです</p>



<p>と言っても特にサーバーなど準備する必要もなく、軽量なファイルがローカルに作成されるだけのお手軽データベース</p>



<p>SQLの知識が必要になりますが、最低限で十分なので覚えて損はないはず</p>



<h2 class="wp-block-heading"><span id="toc2">SQLiteを利用するための準備</span></h2>



<p>PythonはSQLiteを利用するためにはSQLite3を利用しますが、標準ライブラリ入っているので個別のインストールは不要で簡単に利用できます</p>



<p>必須ではないですが、GUIアプリの”<strong>DB Browser for SQLite</strong>”があると管理が楽になるので利用に合わせてお好みで</p>



<p>DB Browser for SQLiteのインストールについてはコチラのページからどうぞ</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-excel-python wp-block-embed-excel-python"><div class="wp-block-embed__wrapper">

<a rel="noopener follow noreferrer" target="_blank" href="https://javeo.jp/sqlite-tool-install/" title="【Python】SQLite3のために&quot;DB Browser for SQLite&quot;をインストール" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img fetchpriority="high" decoding="async" width="320" height="198" src="https://javeo.jp/wp-content/uploads/2024/10/SQLite-320x198.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://javeo.jp/wp-content/uploads/2024/10/SQLite-320x198.png 320w, https://javeo.jp/wp-content/uploads/2024/10/SQLite-240x148.png 240w, https://javeo.jp/wp-content/uploads/2024/10/SQLite-640x396.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Python】SQLite3のために"DB Browser for SQLite"をインストール</div><div class="blogcard-snippet internal-blogcard-snippet">Pythonでスクレイピングをする時にデータベース利用を推奨...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://javeo.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">javeo.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.02.09</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading"><span id="toc3">データ型</span></h2>



<p>SQLiteもデータベースなのでデータ型が存在します</p>



<p>値としてのデータ型とカラムとしてのデータ型の2つの観点があって詳細を知りたいなら<a rel="noreferrer noopener nofollow" target="_blank" href="https://www.sqlite.org/datatype3.html#determination_of_column_affinity" data-type="link" data-id="https://www.sqlite.org/datatype3.html#determination_of_column_affinity">公式ページはコチラ</a>で、ざっくり書き出すと↓↓の通り</p>



<h3 class="wp-block-heading"><span id="toc4">値のデータ型について</span></h3>



<p>SQLiteの値は5種類だけで下記参照</p>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>データ型</th><th>意味</th></tr></thead><tbody><tr><td>NULL</td><td>NULL値。</td></tr><tr><td>INTEGER</td><td>整数。1, 2, 3, 4, 6, or 8 バイトで格納。</td></tr><tr><td>REAL</td><td>浮動小数点数。8バイトで格納。</td></tr><tr><td>TEXT</td><td>テキスト文字列。UTF-8, UTF-16BE or UTF-16-LEのいずれかで保存。</td></tr><tr><td>BLOB</td><td>Binary Large OBject。入力データをそのまま格納。</td></tr></tbody></table></div></figure>



<p>他のデータベースでよくあるBool型、Date型はなく</p>



<ul class="wp-block-list">
<li>Bool型だと整数 0 (False) と 1 (True)&nbsp;で代替</li>



<li>Date型は関数を使用して<strong>TEXT型なら（&#8221;YYYY-MM-DD HH:MM:SS.SSS&#8221;）</strong>、<strong>INTEGER型なら（1970-01-01 00:00:00 UTC からの秒数）</strong>として代替</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">カラムのデータ型について</span></h2>



<p>続いてカラムで設定できるデータ型について</p>



<p>こちらも5種類だけでデータベースとしてはかなり少ないです</p>



<figure class="wp-block-table"><div class="scrollable-table"><table><thead><tr><th>型親和性</th><th>説明</th></tr></thead><tbody><tr><td><strong>TEXT</strong></td><td>基本は文字列として保存される</td></tr><tr><td><strong>NUMERIC</strong></td><td>数値か文字列として保存される（基本は数値）</td></tr><tr><td><strong>INTEGER</strong></td><td>数値として保存される（整数を優先）</td></tr><tr><td><strong>REAL</strong></td><td>小数として保存される</td></tr><tr><td><strong>BLOB</strong></td><td>そのままのデータとして保存される（変換なし）</td></tr></tbody></table></div></figure>



<p>なんですが、実際は指定したデータ型に関係なく値が保存出来ちゃいます</p>



<p>“<strong>SQLite.exe</strong>“でデータを見てみるとこんな感じ</p>



<figure class="wp-block-image size-large"><a rel="follow noopener noreferrer" target="_blank" href="https://javeo.jp/wp-content/uploads/2025/02/image-1.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2025/02/image-1-1024x538.png" alt="" class="wp-image-2898" srcset="https://javeo.jp/wp-content/uploads/2025/02/image-1-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2025/02/image-1-300x158.png 300w, https://javeo.jp/wp-content/uploads/2025/02/image-1-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/02/image-1-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/02/image-1.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>この仕様は良いのか悪いのか・・・</p>



<h3 class="wp-block-heading"><span id="toc6">Pythonで実際に使ってみる</span></h3>



<p>Pythonで使うと言っても基本的にはSQLを実行するだけ（データベースなんだからそりゃそう）</p>



<p>代表的なサンプルソース（≒SQL）を書き出します</p>



<h4 class="wp-block-heading"><span id="toc7">db接続（≒ファイル作成）</span></h4>



<p>DBの接続コマンドでファイルが無ければ生成してくれる</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>import sqlite3

#　---db接続（ファイルがなければ作成される）---
db_file= &quot;test.sqlite3&quot; # 拡張子は&quot;*.db&quot;,&quot;*.sqlite&quot;,&quot;*.db3&quot;,&quot;*.sqlite3&quot;からお好きなものを
conn = sqlite3.connect(db_file) 
# SQLiteを操作するためのカーソルを作成
cur = conn.cursor()</code></pre></div>



<h4 class="wp-block-heading"><span id="toc8">テーブル削除と作成</span></h4>



<p>SQLiteには<strong>&#8220;TRUNCATE TABLE&#8221;</strong>はないので<strong>&#8220;DROP &amp; CREATE&#8221;</strong>で代替</p>



<p><strong>&#8220;条件なしDELETE文&#8221;</strong>でも十分高速処理になるっぽい</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>#　---テーブルを作成---
# テーブルが既にあれば削除する
sql = &quot;DROP TABLE IF EXISTS test_table&quot;
cur.execute(sql)

# item_cdを主キーにテーブルを新規作成
sql = &quot;&quot;&quot;
    CREATE TABLE test_table(
    item_cd INTEGER PRIMARY KEY,
    item_name TEXT,
    item_count INTEGER,
    price INTEGER
    )
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit() # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc9">データの作成（挿入）</span></h4>



<p>複数データを同時にINSERTする時は他のデータベースでは見ない処理方法</p>



<p>無理にまとめて処理しなくてもPythonの中でループ処理もありかも</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データを挿入 ※execute
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (1, &#39;mouse&#39;, 1, 3000)&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# まとめてデータを挿入 ※executemany
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (?,?,?,?)&quot;
data = [(2, &quot;keyboard&quot;, 1, 8000), (3, &quot;monitor&quot;, 1, 15000), (4, &quot;USB cable&quot;, 3, 300), (5, &quot;HDMI cable&quot;, 1, 1000)]
cur.executemany(sql, data)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc10">データの取得</span></h4>



<p>普通のSELECT文</p>



<p>取得データはレコードをTUPLE型、複数レコードはLIST型で取得できるのでforなどでループして取得してあげればOK</p>



<p>変数に格納するならexecute後にfetchallで値を取得できる</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データベースからデータを取得
sql = &quot;SELECT * FROM test_table&quot;
_ = cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    print(row)</code></pre></div>



<h4 class="wp-block-heading"><span id="toc11">データの削除</span></h4>



<p>特に変わりのない一般的な<strong>&#8220;DELETE文&#8221;</strong></p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データを削除
sql = &quot;DELETE FROM test_table WHERE item_cd=1&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc12">データの更新</span></h4>



<p>こちらも一般的な<strong>&#8220;UPDATE文&#8221;</strong></p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データを更新
sql = &quot;UPDATE test_table SET price=5000 WHERE item_name=&#39;keyboard&#39;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc13">同時に削除＆挿入 or 挿入＆更新</span></h4>



<p><strong>&#8220;REPLACE INTO&#8221;</strong>と<strong>&#8220;UPSERT（と同じような処理）&#8221;</strong>の両方使える</p>



<p>データベース的にはUPSERTの方が適切なんだけどREPLACE INTOの方が簡単</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code># データ削除と挿入を同時にする
sql = &quot;&quot;&quot;
    REPLACE INTO test_table (item_cd, item_name, item_count, price)
    VALUES (3, &#39;wide monitor&#39;, 1, 30000)
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データ挿入時に重複なら更新する ※upsert文
sql = &quot;&quot;&quot;
    INSERT INTO test_table (item_cd, item_name, item_count, price)
    VALUES (5, &#39;HDMI cable&#39;, 3, 800)
    ON CONFLICT (item_cd)
    DO UPDATE SET item_count=3, price=800
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない</code></pre></div>



<h4 class="wp-block-heading"><span id="toc14">全部をまとめたサンプルソース</span></h4>



<p>今までのプログラムを全部くっつけただけですが、実行すればSQLiteのプログラムを体感できるソースです</p>



<div class="hcb_wrap"><pre class="prism undefined-numbers lang-python" data-lang="Python"><code>import sqlite3

#　---ファイルがなければ作成してdb接続---
db_file= &quot;test.db&quot; # 拡張子は&quot;.db&quot;か&quot;.sqlite&quot;
conn = sqlite3.connect(db_file) 
# SQLiteを操作するためのカーソルを作成
cur = conn.cursor()

#　---テーブルを作成---
# テーブルが既にあれば削除する
sql = &quot;DROP TABLE IF EXISTS test_table&quot;
cur.execute(&quot;DROP TABLE IF EXISTS test_table&quot;)
# item_cdを主キーにテーブルを新規作成
sql = &quot;&quot;&quot;
    CREATE TABLE test_table(
    item_cd INTEGER PRIMARY KEY,
    item_name TEXT,
    item_count INTEGER,
    price INTEGER
    )
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit() # コミットしないと反映しない

# データを挿入 ※execute
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (1, &#39;mouse&#39;, 1, 3000)&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# まとめてデータを挿入 ※executemany
sql = &quot;INSERT INTO test_table (item_cd, item_name, item_count, price) VALUES (?,?,?,?)&quot;
data = [(2, &quot;keyboard&quot;, 1, 8000), (3, &quot;monitor&quot;, 1, 15000), (4, &quot;USB cable&quot;, 3, 300), (5, &quot;HDMI cable&quot;, 1, 1000)]
cur.executemany(sql, data)
conn.commit()  # コミットしないと反映しない

# データベースからデータを取得
sql = &quot;SELECT * FROM test_table&quot;
_ = cur.execute(sql)
rows = cur.fetchall()
for row in rows:
    print(row)

# データを削除
sql = &quot;DELETE FROM test_table WHERE item_cd=1&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データを更新
sql = &quot;UPDATE test_table SET price=5000 WHERE item_name=&#39;keyboard&#39;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データ削除と挿入を同時にする
sql = &quot;REPLACE INTO test_table (item_cd, item_name, item_count, price) VALUES (3, &#39;wide monitor&#39;, 1, 30000)&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# データ挿入時に重複なら更新する ※upsert文
sql = &quot;&quot;&quot;
    INSERT INTO test_table (item_cd, item_name, item_count, price)
    VALUES (5, &#39;HDMI cable&#39;, 3, 800)
    ON CONFLICT (item_cd)
    DO UPDATE SET item_count=3, price=800
    &quot;&quot;&quot;
cur.execute(sql)
conn.commit()  # コミットしないと反映しない

# 処理結果を見るためにもう一度データを取得
sql = &quot;SELECT * FROM test_table&quot;
_ = cur.execute(sql)
for row in cur.fetchall():
    print(row)</code></pre></div>



<h2 class="wp-block-heading"><span id="toc15">あとがき</span></h2>



<p>CSVを直接書き出すプログラムだと重複チェックやスクレイピングで取得したデータを使った再スクレイピングが難しいのでデータベースが使えると幅が広がります</p>



<p>入門編としてSQLiteは導入コストはないし学習コストも少ないのでオススメです！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/python-sqlite3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
