是否可以在sqlite控制台中添加sqlite脚本,而无需创建c / c ++可加载扩展的开销

时间:2017-10-17 13:45:20

标签: sqlite tcl

很想知道是否有可能以合理的方式“避免”创建可加载的c sqlite扩展并直接在控制台内创建一个“脚本”来为我做一些转换。例如,sqlite文档有一个专门用于某些核心函数https://www.sqlite.org/lang_corefunc.html的站点,如"ABS""random",但是在TCL / JavaScript中创建客户端脚本或者用其他语言做什么都会很方便操作。例如:

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


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

修改

使用SQLite shell脚本直接从CSV文件加载数据库,如下所示:

-- 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 个答案:

答案 0 :(得分:1)

大多数脚本语言(JavaScript除外)中的SQLite驱动程序允许创建用户定义的函数。

例如,SQLite Tcl documentation说:

  

“function”方法使用SQLite引擎注册新的SQL函数。参数是新SQL函数的名称和实现该函数的TCL命令。在调用函数之前,函数的参数将附加到TCL命令。

     

以下示例创建一个名为“hex”的新SQL函数,该函数将其数字参数转换为十六进制编码的字符串:

db function hex {format 0x%X} 

但是,sqlite3命令行shell本身不使用任何脚本语言;除了加载模块之外,没有向其添加功能的机制。