LoginSignup
dhurarara1229
@dhurarara1229

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Go言語でSQLite3を使う際の疑問点

解決したいこと

Go言語でのデータベース操作をUdemyで勉強しているのですが、sqlファイルを実行してターミナルにsqlite>が表示された状態でgoファイルを実行すると、...>となり、^Cで強制離脱しないといけなくなります。.exitでも抜けることができません。

Udemyの動画では、sqlite>が表示された状態でgoファイルを実行してもsqlite>のままで、続けてデータベース操作ができています。この動画は数年前に作成されたものですので、今と仕様が違うのだとは思うのですが、いちいち.exitしてからgoファイルを実行するのは億劫です。

良い解決方法がございましたらご教授ください。
また、動画でsqlite3を使用していたため、同じようにsqlite3を使用しているのですが、Go言語に適したSQLがあればそちらもご教授いただけます幸いです。

ターミナルの例

$ sqlite3 hoge.sql
sqlite3>

# この状態でmain.goを実行すると...
sqlite3> go run カレントディレクトリ/main.go
    ...> 

# 上記のようになり、何か入力しても...>がまた表示されるだけです
# .exitでも抜けられないので、^Cで抜けるしかありません
0

2Answer

TL; DR (今北産業)

  1. 理由: SQL クエリ文の終了を示す ";"(セミコロン)が打たれるまで入力状態になるので ...> と表示され続けます。...> ; ↩️ と打つと、それまでの SQL 文が実行され、エラーが表示されると思います。
  2. 原因: シェルのコマンドを入力するモードになっていないことが原因です。
  3. 対策: @woxtu さんのコメントの通り、SQLite3 の独自コマンドの ".shell" を使う必要があります。
具体的な例
$ sqlite3 hoge.sql
sqlite3> .shell go run <カレントディレクトリ>/main.go

TS; DR (kwsk)

SQLite3 には「ドット・コマンド」と呼ばれる、SQLite3 独自のコマンドがあります。

例えば、SQL のクエリ結果をテーブル表示して見やすくするには、.header コマンドでテーブル名の表示を有効にし、.mode コマンドでカラム表示を有効にするなどがあります。

fuga.sql の DB を開いて table1 の内容を綺麗に表示する例
$ sqlite3 fuga.sql
sqlite3> .header on
sqlite3> .mode column
sqlite3> select rowid, * from table1;
rowid  timestamp            description
-----  -------------------  -----------------------
1      2022-04-16 14:09:52  First sample data. Foo
2      2022-04-16 14:09:58  Second sample data. Bar

つまり、以下の時点では「hoge.sql というファイルを SQLite3 で開いて、SQL 文(クエリ)の入力待ちである」という状態です。

$ sqlite3 hoge.sql
sqlite3>

そのため、go run ...(略) と打っても、SQL クエリの入力をしていると判断され、";" で終わるまで入力を待つ ... > が表示されるのだと思います。

0Like

Your answer might help someone💌