2017-10-17 63 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。 –

相关问题