<?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>「:memory:」タグの記事一覧Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/tag/memory/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Fri, 28 Nov 2025 21:23:07 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>「:memory:」タグの記事一覧Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】SQLiteの基本的な使い方</title>
		<link>https://tech.nkhn37.net/sqlite-basic/</link>
					<comments>https://tech.nkhn37.net/sqlite-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 04 Mar 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[SQLite]]></category>
		<category><![CDATA[:memory:]]></category>
		<category><![CDATA[commit]]></category>
		<category><![CDATA[connect]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[execute]]></category>
		<category><![CDATA[fetchall]]></category>
		<category><![CDATA[sqlite3]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=1223</guid>

					<description><![CDATA[軽量で優れたオープンソースのリレーショナルデータベースである SQLite を Python で使用する方法について解説します。 SQLite SQLite は、軽量で優れた優れたオープンソースのリレーショナルデータベー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">軽量で優れたオープンソースのリレーショナルデータベースである <span class="jinr-d--text-color d--marker1 d--bold">SQLite</span> を Python で使用する方法について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="sqlite">SQLite </h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">SQLite</span> は、軽量で優れた優れたオープンソースのリレーショナルデータベースエンジンです。SQLite の公式ホームページは、<a href="https://www.sqlite.org/index.html" target="_blank" rel="noreferrer noopener">こちら</a>を参照してください。SQLite は、Python 標準ライブラリの <span class="jinr-d--text-color d--marker1 d--bold"><code>sqlite3</code></span> モジュールで扱うことができます。</p>



<p class="wp-block-paragraph">世の中の各種システムで使用されている Oracle、SQLServer、MySQL、PostgreSQL といった有名なデータベースマネジメントシステム（DBMS）では、専用にデータ領域用ファイルを作成して動作します。</p>



<p class="wp-block-paragraph">一方で、SQLite は通常のファイルにデータベースを格納します（一般的に使われる拡張子は <code>.db</code>）。このデータベースファイルは OS の違いなどを超えてコピーして使うことができるため、移植性が非常に高くなっています。</p>



<p class="wp-block-paragraph">また、SQL をサポートしているため単純なリレーショナルデータベースのアプリケーションを作る際には、SQLite は有力な選択肢の 1 つとなります。</p>



<p class="wp-block-paragraph">この記事では、Python で SQLite データベースを使う方法について紹介します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="sqliteの基本的な使い方">SQLite の基本的な使い方</h2>



<h3 class="wp-block-heading jinr-heading d--bold" id="sqliteの基本操作">SQLite の基本操作</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>sqlite3</code></span> を使用して SQLite を扱う基本的な流れは以下となります。</p>



<ol class="wp-block-list jinr-list">
<li><code>sqlite3</code> をインポートする。</li>



<li><code>connect</code> 関数でデータベースファイルに接続する。</li>



<li><code>cursor</code> メソッドでデータベース操作のためのカーソルを準備する。</li>



<li>カーソルの <code>execute</code> メソッドで SQL を実行する。</li>



<li><code>INSERT</code> 等の処理の場合は <code>commit</code> で変更を確定する。</li>



<li>使用後にカーソルとコネクションをクローズする。</li>
</ol>



<p class="wp-block-paragraph">以降では、テーブル作成、データ登録、検索、更新、削除といった基本操作について例を使って説明していきます。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="コネクションを確立しカーソルを用意する">データベースの準備と終了</h4>



<p class="wp-block-paragraph">以降のプログラムで共通であるデータベースの準備と終了の処理について説明します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

...(データベース処理)...

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<p class="wp-block-paragraph">SQLite を使う場合には、<code>sqlite3</code> をインポートし、<span class="jinr-d--text-color d--marker1 d--bold"><code>connect</code></span> 関数で SQLite データベースファイルに接続します。この時にファイルが存在すれば開かれますが、ファイルが存在しない場合はファイルが新規に作成されます。</p>



<p class="wp-block-paragraph">次に、データベースの操作をするためのカーソルを <span class="jinr-d--text-color d--marker1 d--bold"><code>cursor</code></span> メソッドで生成します。</p>



<p class="wp-block-paragraph">これでデータベースを操作するための準備ができ、各種データベースへの処理を実行できます。処理が終わったらカーソルと接続を <span class="jinr-d--text-color d--marker1 d--bold"><code>close</code></span> メソッドによりクローズします。</p>



<p class="wp-block-paragraph">では、以降で具体的なデータベース操作を見ていきましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="テーブルを作成する-create-table">テーブルを作成する（<code>CREATE TABLE</code>）</h4>



<p class="wp-block-paragraph">テーブルを作成するには、作成したカーソルの <span class="jinr-d--text-color d--marker1 d--bold"><code>execute</code></span> メソッドに<code>CREATE TABLE</code> の SQL を指定して実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

print("===== CREATE TABLE =====")
# テーブルを作成する
curs.execute(
    "CREATE TABLE IF NOT EXISTS person ("
    "id INTEGER PRIMARY KEY AUTOINCREMENT"
    ",name VARCHAR"
    ",age INTEGER)"
)
# コミットする
conn.commit()

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<p class="wp-block-paragraph">上記処理を実行すると「<code>test.db</code>」というデータベースファイルが作成されます。</p>



<p class="wp-block-paragraph">この例では「<code>id</code>」「<code>name</code>」「<code>age</code>」という属性がある <code>person</code> テーブルを作成します。<code>id</code> については<em>、</em><code>INTEGER</code> の主キー (<code>PRIMARY KEY</code>) として設定し、自動で採番されるように <code>AUTOINCREMENT</code> を指定しています。</p>



<p class="wp-block-paragraph">また、テーブルが存在しない場合に作成されるように「<code>IF NOT EXISTS</code>」をつけています。この部分を除くと既にテーブルがある場合はエラーとなります。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="データを追加する-insert">データを追加する（<code>INSERT</code>）</h4>



<p class="wp-block-paragraph">テーブルにデータを追加する場合には、<code>execute</code> メソッドで <code>INSERT</code> 文を実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

print("===== INSERT =====")
# プレースホルダ―を使ってデータを指定して登録する
insert_sql = "INSERT INTO person(name, age) VALUES(?, ?)"
curs.execute(insert_sql, ("TARO", 30))
curs.execute(insert_sql, ("JIRO", 20))
curs.execute(insert_sql, ("SABURO", 10))

# コミットする
conn.commit()

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<p class="wp-block-paragraph">データを登録する場合には、以下のように <code>INSERT</code> 用の SQL を用意します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># プレースホルダ―を使ってデータを指定して登録する
insert_sql = "INSERT INTO person(name, age) VALUES(?, ?)"</pre>



<p class="wp-block-paragraph">値を設定するべき部分で「<code>?</code>」となっている部分を<span class="jinr-d--text-color d--marker1 d--bold">プレースホルダ―</span>と言います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">curs.execute(insert_sql, ("TARO", 30))
curs.execute(insert_sql, ("JIRO", 20))
curs.execute(insert_sql, ("SABURO", 10))</pre>



<p class="wp-block-paragraph">プレースホルダーに値を渡しつつ SQL を実行するには、<code>execute</code> メソッドにプレースホルダーを含む SQL 文と入力値をタプルで渡します。</p>



<p class="wp-block-paragraph">設定値が 1 つの場合も <code>(XXX,)</code> のようにタプルで渡すことができます。なお、<code>INSERT</code> でデータ登録後は確定のために <code>commit</code> を忘れないようにしましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="データを検索する-select">データを検索する（<code>SELECT</code>）</h4>



<p class="wp-block-paragraph">追加したデータを検索する場合には、<code>execute</code> メソッドで <code>SELECT</code> 文を実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

print("===== SELECT =====")
# データを検索する
select_all_sql = "SELECT * FROM person"
curs.execute(select_all_sql)
rows = curs.fetchall()
print(rows, "\n")

# 条件を指定して検索する
select_sql = "SELECT * FROM person WHERE age > ?"
curs.execute(select_sql, (20,))
rows = curs.fetchall()
print(rows)

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
===== SELECT =====
[(1, 'TARO', 30), (2, 'JIRO', 20), (3, 'SABURO', 10)] 

[(1, 'TARO', 30)]</pre>



<p class="wp-block-paragraph">データを検索する場合には、以下のように <code>SELECT</code> 用の SQL を用意します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># データを検索する
select_all_sql = "SELECT * FROM person"</pre>



<p class="wp-block-paragraph">上記はすべてのデータを取得する例ですが、もちろん以下のように条件をプレースホルダーで指定して検索することもできます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 条件を指定して検索する
select_sql = "SELECT * FROM person WHERE age > ?"
curs.execute(select_sql, (20,))</pre>



<p class="wp-block-paragraph"><code>SELECT</code> 結果を全て取得する場合は <span class="jinr-d--text-color d--marker1 d--bold"><code>fetchall</code></span> メソッドでタプルのリストとして取得できます。また、件数を指定する場合には、<span class="jinr-d--text-color d--marker1 d--bold"><code>fetchmany</code></span> メソッド、1 件を取得する場合は <span class="jinr-d--text-color d--marker1 d--bold"><code>fetchone</code></span> メソッドが使用できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">rows = curs.fetchall()
print(rows)</pre>



<h4 class="wp-block-heading jinr-heading d--bold" id="データを更新する-update">データを更新する（<code>UPDATE</code>）</h4>



<p class="wp-block-paragraph">データを更新する場合には、<code>execute</code> メソッドで <code>UPDATE</code> 文を実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

print("===== UPDATE =====")
# データを更新する
update_sql = "UPDATE person SET name=? WHERE id=?"
curs.execute(update_sql, ("SHIRO", 1))

# コミットする
conn.commit()

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<p class="wp-block-paragraph">データを更新する場合には、以下のように <code>UPDATE</code> 用の SQL を用意します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># データを更新する
update_sql = "UPDATE person SET name=? WHERE id=?"
curs.execute(update_sql, ("SHIRO", 1))</pre>



<p class="wp-block-paragraph">プレースホルダ―で条件を指定している部分は同じです。<code>UPDATE</code> でデータを更新した場合は、確定のための <code>commit</code> を忘れないようにしましょう。</p>



<p class="wp-block-paragraph">データ更新後、上記で紹介した <code>SELECT</code> で全てのデータを検索すると以下のようにデータが更新されていることが確認できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[(1, 'SHIRO', 30), (2, 'JIRO', 20), (3, 'SABURO', 10)] </pre>



<h4 class="wp-block-heading jinr-heading d--bold" id="データを削除する-delete">データを削除する（<code>DELETE</code>）</h4>



<p class="wp-block-paragraph">データを削除する場合には、<code>execute</code> メソッドで <code>DELETE</code> 文を実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

print("===== DELETE =====")
# データを削除する
delete_sql = "DELETE FROM person WHERE id = ?"
curs.execute(delete_sql, (2,))

# コミットする
conn.commit()

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<p class="wp-block-paragraph">データを削除する場合には、以下のように <code>DELETE</code> 用の SQL を用意します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># データを削除する
delete_sql = "DELETE FROM person WHERE id = ?"
curs.execute(delete_sql, (2,))</pre>



<p class="wp-block-paragraph">プレースホルダ―で条件を指定している部分は同じです。<code>DELETE</code> でデータを削除した場合、削除を確定するための <code>commit</code> を忘れないようにしましょう。</p>



<p class="wp-block-paragraph">データ削除後、上記で紹介した <code>SELECT</code> で全てのデータを検索すると以下のようにデータが削除されていることが確認できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[(1, 'SHIRO', 30), (3, 'SABURO', 10)] </pre>



<h3 class="wp-block-heading jinr-heading d--bold" id="sqliteの基本操作">プレースホルダーを使うようにしましょう</h3>



<p class="wp-block-paragraph">上記で紹介してきた例ではプレースホルダーを使った値の指定を行ってきました。<code>execute</code> メソッドは SQL 文のみをそのまま指定して実行することができるので、画面からの入力値を使って自分で SQL 文字列を組み立てて実行することも可能です。</p>



<p class="wp-block-paragraph">しかし、有名な攻撃手法である <span class="jinr-d--text-color d--marker1 d--bold">SQL インジェクション</span>の対策の 1 つとしてプレースホルダーを使うことは非常に重要です。以下の例で見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

# データベースに接続する
conn = sqlite3.connect("test.db")
# カーソルを作成する
curs = conn.cursor()

print("===== SELECT =====")
# 直接SQLを組み立てる
input_name = "SABURO"
select_sql = f"SELECT * FROM person WHERE name = '{input_name}'"
print(select_sql)
curs.execute(select_sql)
rows = curs.fetchall()
print(rows, "\n")

# 悪意ある入力の場合 (SQLインジェクション)
input_name = "SABURO' or 'A'='A"
select_sql = f"SELECT * FROM person WHERE name = '{input_name}'"
print(select_sql)
curs.execute(select_sql)
rows = curs.fetchall()
print(rows, "\n")

# プレースホルダーを使って検索する
input_name = "SABURO' or 'A'='A"
select_sql = "SELECT * FROM person WHERE name = ?"
curs.execute(select_sql, (input_name,))
rows = curs.fetchall()
print(rows)

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
SELECT * FROM person WHERE name = 'SABURO'
[(3, 'SABURO', 10)] 

SELECT * FROM person WHERE name = 'SABURO' or 'A'='A'
[(1, 'TARO', 30), (2, 'JIRO', 20), (3, 'SABURO', 10)] 

[]</pre>



<p class="wp-block-paragraph">上記の例は、これまでに紹介した <code>CREATE TABLE</code>、<code>INSERT</code> の後にデータがある状態で、検索を実行した場合の例となっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 直接SQLを組み立てる
input_name = "SABURO"
select_sql = f"SELECT * FROM person WHERE name = '{input_name}'"
print(select_sql)
curs.execute(select_sql)
rows = curs.fetchall()
print(rows, "\n")</pre>



<p class="wp-block-paragraph"><code>input_name</code> は画面などから入力された入力値だと思ってください。上記部分では、<code>f-string</code> を使って入力値を埋め込んだ SQL 文を作成し、<code>execute</code> メソッドに SQL 文を指定しています。この方法でも確かに目的となるデータの抽出はできます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 悪意ある入力の場合 (SQLインジェクション)
input_name = "SABURO' or 'A'='A"
select_sql = f"SELECT * FROM person WHERE name = '{input_name}'"
print(select_sql)
curs.execute(select_sql)
rows = curs.fetchall()
print(rows, "\n")</pre>



<p class="wp-block-paragraph">次に上記部分は、悪意のある入力があった例です。<code>input_name</code> という画面入力欄に「<code>SABURO' or 'A'='A</code>」という入力がされたと思ってください。この時に組み立てられるSQL文は「<code>SELECT * FROM person WHERE name = 'SABURO' or 'A'='A'</code>」のようになってしまい、実行結果を見てもらうとすべてのデータが取得できてしまっています。</p>



<p class="wp-block-paragraph">これは情報漏洩等の観点から大きな問題です。また、他にもデータを全て削除するようなコードが埋めこまれるなど色々なパターンの攻撃が考えられます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># プレースホルダーを使って検索する
input_name = "SABURO' or 'A'='A"
select_sql = "SELECT * FROM person WHERE name = ?"
curs.execute(select_sql, (input_name,))
rows = curs.fetchall()
print(rows)</pre>



<p class="wp-block-paragraph">上記はプレースホルダーを使って検索している部分です。入力として悪意のある入力があったとしても、プレースホルダーを使った場合は検索結果は空（<code>[]</code>）となって不正にデータ取得はできていないことが分かります。</p>



<p class="wp-block-paragraph">SQL インジェクション対策としては、他にも画面入力の際にエスケープ処理（ルールに従ってプログラムで使われる特殊文字や記号を別の文字列に置き換える）といった対策等がありますが、プレースホルダーは非常に有効な対策の 1 つです。</p>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">外部からの入力値で SQL を組み立てる際は必ずプレースホルダ―を使いましょう。</span></p>



<h3 class="wp-block-heading jinr-heading d--bold" id="メモリを使用したデータベース操作">メモリを使用したデータベース操作</h3>



<p class="wp-block-paragraph">SQLite の便利な使い方として、メモリー上にデータベースを作る方法があります。メモリー上でデータベースを作成し操作したい場合には、以下例のように「<span class="jinr-d--text-color d--marker1 d--bold"><code>:memory:</code></span>」と指定します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import sqlite3

conn = sqlite3.connect(":memory:")
curs = conn.cursor()

print("===== CREATE TABLE =====")
# テーブルを作成する
curs.execute(
    "CREATE TABLE person ("
    "id INTEGER PRIMARY KEY AUTOINCREMENT, "
    "name VARCHAR,"
    "age INTEGER)"
)
# 作成したテーブルをコミットする
conn.commit()

print("===== INSERT =====")
# プレースホルダ―を使ってデータを指定して登録する
insert_sql = "INSERT INTO person(name, age) VALUES(?, ?)"
curs.execute(insert_sql, ("TARO", 30))
curs.execute(insert_sql, ("JIRO", 20))
curs.execute(insert_sql, ("SABURO", 10))
# コミットする
conn.commit()

print("===== SELECT =====")
# データを検索する
curs.execute("SELECT * FROM person")
rows = curs.fetchall()
print(rows)

print("===== UPDATE =====")
# データを更新する
update_sql = "UPDATE person SET name=? WHERE id=?"
curs.execute(update_sql, ("SHIRO", 1))
# コミットする
conn.commit()
# データを検索する
curs.execute("SELECT * FROM person")
rows = curs.fetchall()
print(rows)

print("===== DELETE =====")
# データを削除する
curs.execute("DELETE from person WHERE id = 2")
# コミットする
conn.commit()
# データを検索する
curs.execute("SELECT * FROM person")
rows = curs.fetchall()
print(rows)

# カーソルとコネクションをクローズする
curs.close()
conn.close()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
===== CREATE TABLE =====
===== INSERT =====
===== SELECT =====
[(1, 'TARO', 30), (2, 'JIRO', 20), (3, 'SABURO', 10)]
===== UPDATE =====
[(1, 'SHIRO', 30), (2, 'JIRO', 20), (3, 'SABURO', 10)]
===== DELETE =====
[(1, 'SHIRO', 30), (3, 'SABURO', 10)]</pre>



<p class="wp-block-paragraph">上記例は、これまで紹介してきた各種処理を順に実行しているプログラムになります。このプログラムはメモリ上で動作するため、プログラム実行後にデータは消えてしまいますが、何回実行しても結果は同じになります。</p>



<p class="wp-block-paragraph">実際に <code>test.db</code> 等で作ってしまうと実行のたびに状態が変わるため、必ずしも実行結果が同じになるとは限りません。確認のためには実行前に一度ファイルを消してから再度実行するといった面倒な作業が必要になります。</p>



<p class="wp-block-paragraph">プログラム開発時には「<code>:memory:</code>」でメモリ上に展開しながら動作を確認して、問題ないことが確認出来たら、実際のデータベースファイルに書いてテストすると非常に効率よく開発を進めることができます。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">軽量で優れたオープンソースのリレーショナルデータベースである <span class="jinr-d--text-color d--marker1 d--bold">SQLite</span> を Python で使用する方法について解説しました。SQLite データベースは、Python 標準ライブラリの <span class="jinr-d--text-color d--marker1 d--bold"><code>sqlite3</code></span> モジュールで扱うことができます。</p>



<p class="wp-block-paragraph">SQLite は、SQL をサポートしているため単純なリレーショナルデータベースのアプリケーションを作る際には有力な選択肢の 1 つです。ぜひ、使い方を覚えていただき　Python プログラミングで有効活用してください。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-libraries/sqlite" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/sqlite-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-15 17:01:17 by W3 Total Cache
-->