2017-10-17 107 views
0

想知道是否可以合理的方式「避免」創建可加載的c sqlite擴展並直接創建「腳本」在控制檯內部爲我做一些轉換。例如,sqlite文檔有一個專門用於某些核心功能https://www.sqlite.org/lang_corefunc.html(如"ABS""random")的網站,但在TCL/JavaScript中創建客戶端腳本或執行其他操作的語言會很方便。例如:是否有可能在sqlite控制檯中添加sqlite腳本,而無需創建c/C++可加載擴展

# User script 
proc reversedResult(result) { 
    return [string reverse $a] 
} 


select reversedResult(db.name) from users where id=1 

編輯:

的數據的基礎上被直接從CSV文件使用一個SQLite外殼腳本如下加載:

-- created at 2017-10-17 10:43:42.430129 
-- script path /tmp/popDb/cmd1508226222.txt 

CREATE TABLE 'hash_gen' ( 
         'key' TEXT PRIMARY KEY NOT NULL, 
         'hash' INT NOT NULL <<<<<< HERE I WANT TO USE A HASHING FUNCTION 
        ); 
CREATE INDEX hash_gen_index ON hash_gen (hash); 

CREATE TABLE 'info' (
         key TEXT PRIMARY KEY NOT NULL, 
         value TEXT NOT NULL 
        ); 

INSERT INTO 'info' VALUES('primary_table','products'); 

INSERT INTO 'info' VALUES('primary_key','sku'); 

INSERT INTO 'info' VALUES('db_version','1.0.0'); 

CREATE TABLE products (
sku TEXT PRIMARY KEY NOT NULL, 
...many more columns... 
); 
CREATE TRIGGER hash_gen_trigger 
    AFTER INSERT 
    ON 'products' 
    BEGIN 
     INSERT INTO hash_gen(key,hash) VALUES(new.sku,MY_CUSTOM_HASH_FUNCTION(new.sku,...all other fields,....)); 
END; 
.mode csv 
.import /tmp/inputCSV/1503331189113.csv products 
.... 

<<<< MY_CUSTOM_HASH_FUNCTION(input) {return custom_hash_on_(input)...} 

,然後最終的db是作爲單獨流程的一部分創建的(在使用不同編程語言(scala)的不同工具中):

sqlite3 /output/path/db.db < /tmp/popDb/cmd1508226222.txt 

回答

1

大多數腳本語言(JavaScript除外)中的SQLite驅動程序允許創建用戶定義的函數。

例如,SQLite Tcl documentation說:

的 「功能」 的方法與SQLite的發動機註冊新的SQL函數。參數是新SQL函數的名稱和實現該函數的TCL命令。在函數調用之前,該函數的參數被附加到TCL命令。

下面的示例創建一個名爲「六角」,在其數字參數轉換爲十六進制編碼字符串一個新的SQL函數:

db function hex {format 0x%X} 

然而,sqlite3命令行shell本身不使用任何腳本語言;除了加載模塊外,沒有任何機制可以爲其添加功能。

+0

我同意但由於我沒有直接使用TCL腳本,而是SQLITE shell腳本不知道如何添加這些函數。即SQL「命令」文件。我會更新我的問題,以反映該問題 –

+0

你最好的辦法是在Tcl中實現'sqlite3' shell。 –

相關問題