如何在 Mac 上的 SQLite 中本地安装扩展?



我对安装扩展没有真正的了解。我被困住了,因为我无法在SQLite中使用SQRT。

我在本地机器上使用Laravel,并且正在进行PHPunit测试。在一个测试中,我使用了一个带有一些繁重数学函数的查询。

我收到错误:

Caused by
PDOException: SQLSTATE[HY000]: General error: 1 no such function: SQRT

我发现SQLite有一个名为:extension-functions.c的扩展

。 我下载了它,但我不确定我是否正确完成了所有操作(显然不是因为它不起作用(:

  1. 我下载了它并在我的终端中使用它

    gcc -fno-common -dynamiclib extension-functions.c -o libsqlitefunctions.dylib
    
  2. 它编译了这些数据:libsqlitefunctions.dylib
  3. 使用 php -
  4. -ini 如果发现我的 php.ini 位于/usr/local/etc/php/7.1/php 中.ini
  5. 现在我查找了 sqlite3 并发现这个评论;sqlite3.extension_dir =
  6. 我把它改成了

    sqlite3.extension_dir =/usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib
    
  7. 并创建了扩展文件夹并将 dylib 文件放入其中

  8. 我用sudo apachectl重新启动了我的apache

  9. 并尝试了我的查询,但仍然失败。我做错了什么?

对于未来的读者

要在Laravel中使用它,您可以这样称呼它:

$pdo = DB::connection()->getPdo();
$pdo->sqliteCreateFunction('SQRT', 'sqrt', 1);
$pdo->sqliteCreateFunction('ASIN', 'asin', 1);
$pdo->sqliteCreateFunction('SIN', 'sin', 1);
$pdo->sqliteCreateFunction('COS', 'cos', 1);
$pdo->sqliteCreateFunction('POWER', 'pow', 2);
$pdo->sqliteCreateFunction('pi', 'pi', 0);

似乎您想将其与PDO一起使用。问题是加载扩展只能直接使用 SQLite3::loadExtension 方法与 SQLite3 api一起使用。

PDO驱动程序不允许加载扩展(请参阅"安全注意事项"下有关可加载扩展的维基条目(。

因此,您可以直接使用 SQLite3 api,也可以将"用户定义的函数"与 PDO 一起使用。例如,如果您需要SQRT函数:

$db = new PDO('sqlite:testdb.sqlite', null, null, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$db->sqliteCreateFunction('SQRT', 'sqrt', 1);
$stmt = $db->query("SELECT sqrt(25)");
foreach ($stmt as $row) {
echo $row[0], PHP_EOL; // output: 5.0
}

扩展提供的大多数数学函数都 1:1 映射到 PHP 函数名称(如sqrt(,因此创建所需的函数应该很容易。

您似乎将sqlite3.extension_dir属性指向文件而不是目录。根据sqlite3手册,extension_dir属性为:

[该] SQLite 的可加载扩展所在的目录的路径。

我认为如果你改变它可能会起作用

sqlite3.extension_dir = /usr/local/etc/php/7.1/extension/libsqlitefunctions.dylib

sqlite3.extension_dir = /usr/local/etc/php/7.1/extension

但是,我会为 SQLite3 扩展创建一个单独的目录,这样它们就不会与 PHP 扩展混合;我之所以这样说,是因为您当前似乎正在使用sqlite3.extension_dir属性的 PHP 扩展目录。(如果您不是,请忽略此注释。我假设 SQLite3 只是扫描配置的目录中的可加载模块并使用类似dlopen的内容加载它们。如果它尝试加载 PHP 扩展,这可能会发生冲突。(谁知道呢,它可能会优雅地处理这个问题。

相关内容

  • 没有找到相关文章

最新更新