[PostgreSQL] 用 pgsanity 檢查 .sql 檔案是否有語法錯誤
最近專案遇到了一個問題,有一個 SQL 檔案在修改後,
沒辦法被 psql 指令拿來執行了~
下面是一個 SQL 檔案的例子,看得出來問題在哪嗎?
CREATE TABLE tbl_task ( ID BIGSERIAL PRIMARY KEY NOT NULL, SHA1 CHAR(40) NOT NULL, );
上面那個 SQL 檔案有個語法錯誤,
在 SHA1 那一行的 NOT NULL 後面,是不能有逗號 “,” 的!
老實說這種問題實在很難用人眼注意到…
當然我們直接用 psql 一跑就可以發現問題,
但有沒有在不執行 SQL 指令的狀況下,就能得知語法問題呢?
在網路上找到了 pgsanity 這個專案,它可以檢查 SQL 檔案是否符合 PostgreSQL 的語法~
它的運作方式是將 SQL 檔案轉成內含 SQL 指令的 C 檔案,
再呼叫 PostgreSQL 內附的 ecpg 指令來檢查有沒有語法錯誤。
來看看怎麼用它吧~
1. 安裝 pgsanity
用 pip 直接安裝:
pip install pgsanity
2. 安裝 PostgreSQL
因為 ecpg 是含在 PostgreSQL 套件裡面,因此我們得安裝 PostgreSQL 才行~
在 Mac 上可以直接用 Homebrew 安裝:
brew install postgresql
在 CentOS 上面的話,要安裝 postgresql-devel:
sudo yum install postgresql-devel
3. 使用 pgsanity 檢查 SQL 檔案
用 pgsanity <file> 來檢查 SQL 檔案,
有問題的話,就會顯示出第一個語法錯誤的地方,例如:
testuser@localhost ~ $ pgsanity create_tables.sql line 6: ERROR: syntax error at or near ")"
當我們將語法錯誤修正之後,就不會有任何輸出了:
testuser@localhost ~ $ pgsanity create_tables.sql testuser@localhost ~ $
但要注意的是,pgsanity 並不是萬能的,
它只能檢查 SQL 語法是否正常,但 PostgreSQL 特有的指令是不行的…
舉例來說,下面的指令在 SQL 檔案裡,是可以被 psql 執行的:
\echo Hello select * from data;
但 pgsanity 會回報語法錯誤:
testuser@localhost ~ $ pgsanity test.sql line 1: ERROR: syntax error at or near "\"
參考資料:postgresql syntax check without running the query