ラベル attach の投稿を表示しています。 すべての投稿を表示
ラベル attach の投稿を表示しています。 すべての投稿を表示

2021年10月30日土曜日

SQLite3 アタッチ時のエラー (同じエイリアス名)

概要

「Error: database sub is already in use」はアタッチ時に指定した別名が 既に利用されている場合のエラーメッセージ。

再現例

実行環境
  • Windows 10 64bit
  • SQLite3 (3.36.0) Command-Line Shell

sqlite> attach database "./sample2.db" as sub;
sqlite> attach database "./sample3.db" as sub;
Error: database sub is already in use
                

参考URL

2021年10月16日土曜日

SQLite3 存在しないファイル名をアタッチすると0Byteのファイルが出来る

概要

ATTACH構文を利用すると複数のデータベースファイルを同時に操作することができるが、 存在しないファイルを指定すると空のファイルが新規作成される。

SQLite3 のデータベースとして操作することが出来るので、 テーブルを作成したり、データを挿入したりすることもできる。
DETACHで切り離しても作成されたファイルは残る。

データベースファイルに接続しつつ、別のデータベースファイルを新規作成する、 というようなことに応用出来るかもしれない。

エラーメッセージや新規作成のメッセージが出ないので、 間違って指定してしまった場合 すぐに気づけないのが難点。

実行例

Attach Attach sample1.db sample1.db sample2.db sample2.db Connect Connect User User Viewer does not support full SVG 1.1
実行環境
  • Windows 10 64bit
  • SQLite3 (3.36.0) Command-Line Shell

C:\temp>rem # 1.
C:\temp>dir
ドライブ C のボリューム ラベルは Windows です
ボリューム シリアル番号は XXXX-XXXX です

C:\temp のディレクトリ

2021/10/14  20:29    <DIR>          .
2021/10/14  20:29    <DIR>          ..
2021/10/14  20:29             8,192 sample1.db
                1 個のファイル               8,192 バイト
                2 個のディレクトリ  61,635,493,888 バイトの空き領域

C:\temp>rem # 2.
C:\temp>sqlite3 sample1.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.

sqlite> -- # 3.
sqlite> attach database "./sample2.db" as sub;

sqlite> -- # 4.
sqlite> .databases
main: C:\temp\sample1.db r/w
sub: C:\temp\sample2.db r/w

sqlite> .shell dir
 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は xxxx-xxxx です

 C:\temp のディレクトリ

2021/10/17  16:36    <DIR>          .
2021/10/17  16:36    <DIR>          ..
2021/10/14  20:29             8,192 sample1.db
2021/10/14  20:31                 0 sample2.db
               2 個のファイル               8,192 バイト
               2 個のディレクトリ  62,306,549,760 バイトの空き領域

sqlite> -- # 5.
sqlite> create table sub.user
   ...> (
   ...>     id integer
   ...>     , name text
   ...> );
sqlite> insert into sub.user
   ...> values (
   ...>     1
   ...>     , 'test_user'
   ...> );
sqlite> select * from sub.user;
1|test_user

sqlite> -- # 6.
sqlite> detach sub;

sqlite> -- # 7.
sqlite> .open "./sample2.db"
sqlite> .databases
main: C:\temp\sample2.db r/w

sqlite> -- # 8.
sqlite> .tables
user
sqlite> select * from user;
1|test_user
                
  1. 現在のディレクトリにあるのはsample1.dbファイルのみ
  2. sample1.dbに接続
  3. sample2.dbを別名subでアタッチ
  4. 新規にsample2.dbが作成される
  5. sample2.dbにテーブルを作成しデータを挿入
  6. sample2.dbをデタッチ
  7. sample1.dbを切断し、sample2.dbに接続しなおす
  8. 先ほど作成したテーブルの内容が確認できる

参考URL

2021年10月2日土曜日

SQLite3 同時に複数のデータベースファイルを操作する (ATTACH/DETACH)

概要

SQLiteでは1ファイルを1データベースとして扱う。 複数のデータベースを同時に操作する場合、 まず一つ目のデータベースファイルに接続し、 二つのデータベースファイルをアタッチ(接続)する。 使用後はデタッチ(切り離し)すればいい。

構文

データベースをアタッチ(接続)する


attach database database_path as alias_name;
                

データベースをデタッチ(切り離し)する


detach alias_name;
                

仕様

アタッチするデータベースには別名をつけておき、 selectやinsertを利用する際は「別名.テーブル名」でアクセスする。 最初に接続したデータベースは「main.テーブル名」でアクセスする。 テーブル名だけでもアクセス出来るが、同じテーブル名が別々のデータベースにあった場合 どちらを操作しているかわかりづらくなってしまう。 データベースをデタッチする際も別名を指定する。

同時にアタッチできるデータベースの数は10個。

実行例

2つのデータベースを跨ってテーブルを結合してselectしてみる。

sub sub main main Attach Attach sample1.db sample1.db sample2.db sample2.db id id name name 1 1 tomato tomato 2 2 potato potato 3 3 pumpkin pumpkin product product id id name name 1 1 tomato tomato 2 2 potato potato 4 4 cassava cassava product product Connect Connect User User Viewer does not support full SVG 1.1
実行環境
  • Windows 10 64bit
  • SQLite3 (3.36.0) Command-Line Shell

C:\temp>rem # 1. 
C:\temp>sqlite3 ./sample1.db
SQLite version 3.36.0 2021-06-18 18:36:39
Enter ".help" for usage hints.

sqlite> -- # 2.
sqlite> attach database "./sample2.db" as sub;

sqlite> -- # 3.
sqlite> .databases
main: C:\temp\sample1.db r/w
sub: C:\temp\sample2.db r/w

sqlite> .headers on
sqlite> .mode box

sqlite> -- #4.
sqlite> select
   ...>     main.product.id     as id_1
   ...>     , main.product.name as name_1
   ...>     , sub.product.id    as id_2
   ...>     , sub.product.name  as name_2
   ...> from
   ...>     main.product
   ...> left join
   ...>     sub.product
   ...>     on
   ...>         main.product.id = sub.product.id
   ...> ;
┌──────┬─────────┬──────┬────────┐
│ id_1 │ name_1  │ id_2 │ name_2 │
├──────┼─────────┼──────┼────────┤
│ 1    │ tomato  │ 1    │ tomato │
│ 2    │ potato  │ 2    │ potato │
│ 3    │ pumpkin │      │        │
└──────┴─────────┴──────┴────────┘

sqlite> -- # 5.
sqlite> detach sub;
sqlite> .databases
main: C:\temp\sample1.db r/w
                
  1. sample1.db に接続する。
  2. sample2.db を別名subでアタッチする。
  3. コマンドラインツールであれば接続しているデータベースを「.databases」で確認できる。
  4. sample1.db の user テーブルとsample2.db の user テーブルを結合して取得する。
  5. sample2.db をデタッチする。

insert、update、delete なども使えるので サブクエリ等を上手く使えば2つのデータベース間でデータのやり取りが出来る。

同時にアタッチできるデータベースの数は10個

10個以上アタッチしようとすると「Error: too many attached databases - max 10」というエラーが出る。


    sqlite> .databases
    main: C:\temp\sample0.db r/w
    sub1: C:\temp\sample1.db r/w
    sub2: C:\temp\sample2.db r/w
    sub3: C:\temp\sample3.db r/w
    sub4: C:\temp\sample4.db r/w
    sub5: C:\temp\sample5.db r/w
    sub6: C:\temp\sample6.db r/w
    sub7: C:\temp\sample7.db r/w
    sub8: C:\temp\sample8.db r/w
    sub9: C:\temp\sample9.db r/w
    sub10: C:\temp\sample10.db r/w
    
    sqlite> attach database "./sample11.db" as sub11;
    Error: too many attached databases - max 10
                

参考URL