SQLite初心者です。二つのデータベースファイルを結合して一つのデータベースファイルを作りたいです。
data1.db
Table名 table1
ID data1
1 a
2 b
3 c
4 d
5 e
data2.db
Table名 table2
ID data2
1 あ
2 い
3 う
4 え
5 お
という二つのSQLightのデータベースファイルを結合して
Result.db
Table名 table3
ID data1 data2
1 a あ
2 b い
3 c う
4 d え
5 e お
というファイルを作りたい。下の様に書いてみます。
import sqlite3
db1 = 'data1.db'
db2 = 'data2.db'
conn = sqlite3.connect(db1)
c = conn.cursor()
c.execute(' ここにSQL命令文')
# コミット
conn.commit()
# コネクションを閉じる
conn.close()
テーブルの合体には、OUTER JOINとか言う命令を使うっぽいですが、
SQL命令分の所に
SELECT * FROM data1
LEFT OUTER JOIN data2
ON data1.ID = data2.ID;
とかやればいいのかと思いきや、conn = sqlite3.connect(db1)で呼び出しているのはdata1.dbだけ。
どうやって、二つのファイルのデータベースを合体すればいいのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
ATTACH DATABASE
が使えます。sqlite はファイル名がそのままデータベースなのでこんな感じで使います。
追記:
ややこしいんでカラムも table1.col1
、table2.col2
に読み替えちゃいますね(それぞれ元は table1.data1
、table2.data2
)。
import sqlite3
conn = sqlite3.connect('result.db')
c = conn.cursor()
c.execute("ATTACH DATABASE 'data1.db' as data1;")
c.execute("ATTACH DATABASE 'data2.db' as data2;")
c.execute("CREATE TABLE result(id,col1,col2;")
c.execute("INSERT INTO result SELECT table1.id,col1,col2 FROM data1.table1 INNER JOIN data2.table2 on data1.table1.id = data2.table2.id;")
res = c.execute("SELECT * FROM result")
print(list(res))
# [(1, 'a', 'あ'), (2, 'b', 'い'), (3, 'c', 'う'), (4, 'd', 'え'), (5, 'e', 'お')]
conn.commit()
conn.close()
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
SQLite テーブルのデータをCSV形式でエクスポート/インポートを使って同じ xxx.db に持って来て(ディスク容量に注意)、SELECT ... JOIN ... します。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
意図しているものは、以下の記事内容が参考になりますでしょうか。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2021/01/14 22:36
上を質問修正に合わせて修正頂けると大変ありがたいのですが……
2021/01/14 23:49
c.execute("INSERT INTO result SELECT table1.id,col1,col2 FROM data1.table1 INNER JOIN data2.table2 on data1.table1.id = data2.table2.id;")
のところを
c.execute("INSERT INTO result SELECT table1.id,col1,col2 FROM table1 INNER JOIN table2 on table1.id = table2.id;")
とちょっと修正したら動きました!