如何将扩展加载到SQLite中?

Chu*_*cky 12 sql sqlite aggregate aggregate-functions standard-deviation

我需要在SQLite中使用标准偏差函数.我在这里找到一个:

http://www.sqlite.org/contrib?orderby=date

但它是SQLite的扩展文件的一部分.我以前从未安装过其中一种,我不知道该怎么做.我在http://www.sqlite.org/lang_corefunc.html找到了这个现有函数load_extension,但我不明白参数X和Y是什么.

基本上,我需要有人给我一个关于如何安装聚合扩展文件的分步指南.谁能这样做?

Ben*_*oit 16

SQLite扩展是具有动态链接的库.你可以在这里找到一些例子(这是一个储存库,点击"登录/填充验证码"以启用超链接).例如,见md5.c.

  • load_extension 必须在SQLite中启用(pragma IIRC)
  • 它需要作为第一个参数的库的路径
  • 第二个参数是入口点函数的名称(在md5.c中sqlite3_extension_init).它的原型必须是int(sqlite3*, char **, const sqlite3_api_routines *).
  • 在SQL中,您可以尝试SELECT load_extension('md5.so', 'sqlite3_extension_init');或简单地SELECT load_extension('md5.so');

你可以尝试编译md5.c,并从sqlite shell中使用.load md5.so

  • 我目前有类似的问题.我试图在sqlite中执行SELECT load_extension('mod_spatialite'),我有相应的mod_spatialite.dll文件,但我无法让它工作.我在哪里需要放置.dll文件? (2认同)

Ant*_*nko 7

您可以按照loadext.html

  1. 下载.c扩展文件
  2. 使用loadext.csv.c中第 3 节“编译可加载扩展”中的命令在本地编译文件(如果有编译错误,请检查相关的 SO 问题)
  3. sqlite3_load_extension(PATH)通过(.load PATH在 CLI 或SELECT load_extension(PATH)查询中)加载库,其中PATH是已编译库的相对路径或完整路径,出于兼容性原因,最好没有文件扩展名(即,.load csv.load csv.dylib或您的系统添加的任何扩展名)

对于extension-functionsMacOS,它将是:

curl --location --output extension-functions.c 'https://www.sqlite.org/contrib/download/extension-functions.c?get=25'
gcc -g -fPIC -dynamiclib extension-functions.c -o extension-functions.dylib
Run Code Online (Sandbox Code Playgroud)

测试扩展:

SELECT load_extension("extension-functions");
CREATE TABLE test(x REAL);
INSERT INTO test (x) VALUES
  (1),
  (2),
  (3),
  (4),
  (5);
SELECT stdev(x) FROM test;
Run Code Online (Sandbox Code Playgroud)

预期输出:1.58113883008419

sqlite.org 的 Larry Brasfield 还解释了可以将编译后的库放在哪里,以使其可以在整个系统中访问:

如果您在 .load 命令中或到 sqlite3_load_extension() 调用或到 SQL 中的 load_extension() SQLite 函数(启用扩展加载时)提供绝对路径,则将加载该路径指定的扩展(如果可。)

如果要在没有绝对路径的情况下将扩展命名为加载机制之一,则必须安排可以通过 dlopen(...) 进行的搜索来定位已编译的扩展。这可能会有所不同,但通常它会按照由冒号分隔的值从左到右列出的顺序检查由环境变量 LD_LIBRARY_PATH 指定的目录,然后是 /lib 和 /usr/lib。

因此,您可以将扩展放在已搜索到的位置,或者可以使用“env”命令启动 SQLite CLI,并修改 $LD_LIBRARY_PATH 的值(其中包括放置扩展的位置)。或者,您可以简单地修改使用 CLI 的会话的环境变量。(这可能会导致微妙的问题,因此请确保您了解其中的潜在影响。)