Ruby 使用sqlite gem中的非默认sqlite3可执行文件

Ruby 使用sqlite gem中的非默认sqlite3可执行文件,ruby,sqlite,sequel,Ruby,Sqlite,Sequel,我编译了一个定制的sqlite3可执行文件,以支持ICU(排序规则:utf-8的重音排序等) 我使用rvm,ruby sqlite gem似乎使用: ~/.rvm/gems/ruby-1.9.3-p392@project/gems/sqlite3-1.3.7/lib/sqlite3/sqlite3_native.so 我的db创建代码需要排序规则,因此当我使用sqlite gem时,会出现一个错误: /home/user/.rvm/gems/ruby-1.9.3-p392@project/ge

我编译了一个定制的sqlite3可执行文件,以支持ICU(排序规则:utf-8的重音排序等)

我使用rvm,ruby sqlite gem似乎使用:

~/.rvm/gems/ruby-1.9.3-p392@project/gems/sqlite3-1.3.7/lib/sqlite3/sqlite3_native.so
我的db创建代码需要排序规则,因此当我使用sqlite gem时,会出现一个错误:

/home/user/.rvm/gems/ruby-1.9.3-p392@project/gems/sqlite3-1.3.7/lib/sqlite3/database.rb:91:in `initialize': SQLite3::SQLException: no such function: icu_load_collation (Sequel::DatabaseError)
…这是有意义的,因为默认sqlite没有内置的排序规则

当我直接使用自定义sqlite3可执行文件时,一切正常

我的问题如下:

$ mkdir ~/.bundle
$ echo "BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/  --with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs  --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`" > ~/.bundle/config
  • 有没有办法获得内置ICU支持的debian/ubundu sqlite3包?我找不到

  • 如果(1)不可能,我是否需要编译sqlite3并创建一个静态库而不是一个可执行文件

  • 如果(2)是可能的,我如何正确地进行更改?我使用bundler并在另一台机器上部署

  • 有没有其他方法可以让sqlite gem看到我的本机可执行文件(或者.so,如果有可能的话)

  • 提前谢谢大家,


    K.

    我终于成功了。要在使用特定选项编译本机扩展(如对sqlite的ICU支持)时安装gem,需要执行以下操作:

    $ gem install sqlite3 --verbose --                                      \
        --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/    \
        --with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs   \
        --with-cflags='-O3 -DSQLITE_ENABLE_ICU'                             \
        --with-cppflags=`icu-config --cppflags`                             \
        --with-ldflags=`icu-config --ldflags`
    
    在这两个“空”破折号后面的任何东西“-”都是gem构建过程中的参数。这假设sqlite3的src发行版在以下位置解压缩:
    /home/user/local/lib/sqlite-autoconf-3071602/

    现在,因为我使用bundler,所以我希望这是自动化的。为此,可以使用以下命令:

    bundle config build.sqlite3 --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/ ...
    
    。。。这意味着无论何时安装sqlite3 gem,都要在构建过程中传递以下选项。这将创建一个
    ~/.bundle/config
    文件,其中包含该gem的条目,例如,该文件将具有:

    BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/karask/local/lib/sqlite-autoconf-3071602/  --with-opt-lib=/home/karask/local/lib/sqlite-autoconf-3071602/.libs  --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`
    
    然而,这对我来说并不合适。由于某种原因,
    ~/.bundle/config
    中的条目不正确。我试着引用和逃避了好几种组合,但都没有成功。最后,我通过添加以下内容,在部署过程(shell脚本)中手动创建此条目:

    $ mkdir ~/.bundle
    $ echo "BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/  --with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs  --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`" > ~/.bundle/config
    

    我终于成功了。要在使用特定选项编译本机扩展(如对sqlite的ICU支持)时安装gem,需要执行以下操作:

    $ gem install sqlite3 --verbose --                                      \
        --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/    \
        --with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs   \
        --with-cflags='-O3 -DSQLITE_ENABLE_ICU'                             \
        --with-cppflags=`icu-config --cppflags`                             \
        --with-ldflags=`icu-config --ldflags`
    
    在这两个“空”破折号后面的任何东西“-”都是gem构建过程中的参数。这假设sqlite3的src发行版在以下位置解压缩:
    /home/user/local/lib/sqlite-autoconf-3071602/

    现在,因为我使用bundler,所以我希望这是自动化的。为此,可以使用以下命令:

    bundle config build.sqlite3 --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/ ...
    
    。。。这意味着无论何时安装sqlite3 gem,都要在构建过程中传递以下选项。这将创建一个
    ~/.bundle/config
    文件,其中包含该gem的条目,例如,该文件将具有:

    BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/karask/local/lib/sqlite-autoconf-3071602/  --with-opt-lib=/home/karask/local/lib/sqlite-autoconf-3071602/.libs  --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`
    
    然而,这对我来说并不合适。由于某种原因,
    ~/.bundle/config
    中的条目不正确。我试着引用和逃避了好几种组合,但都没有成功。最后,我通过添加以下内容,在部署过程(shell脚本)中手动创建此条目:

    $ mkdir ~/.bundle
    $ echo "BUNDLE_BUILD__SQLITE3: --with-opt-include=/home/user/local/lib/sqlite-autoconf-3071602/  --with-opt-lib=/home/user/local/lib/sqlite-autoconf-3071602/.libs  --with-cflags='-O3 -DSQLITE_ENABLE_ICU' --with-cppflags=`icu-config --cppflags` --with-ldflags=`icu-config --ldflags`" > ~/.bundle/config
    
    我想使用Ubuntu18.10中提供的SQLite 3.24.0中没有的,这里有一种编译SQLite 3.28.0的方法(Ubuntu19.04附带SQLite 3.27):

    #最好安装系统包,以确保您具有必要的依赖项:
    sudo-apt安装libsqlite3-dev
    wgethttps://sqlite.org/src/tarball/sqlite.tar.gz?r=release -O sqlite.tar.gz
    tar xzf sqlite.tar.gz
    mkdir构建
    光盘制作
    ../sqlite/configure
    export CFLAGS='-DSQLITE\u ENABLE\u COLUMN\u METADATA-DSQLITE\u ENABLE\u DBSTAT\u VTAB-DSQLITE\u ENABLE\u ENABLE\u LOAD\u EXTENSION-DSQLITE\u ENABLE\u PREUPDATE\u HOOK-DSQLITE\u ENABLE\u RTREE-DSQLITE\u ENABLE\u SESSION-DSQLITE\u STMTVTAB-DSQLITE\u ENABLE\u UNKNOWN\u SQL\u函数-DSQLITE\u ENABLE\u UNLOCK\u NOTIFY-DSQLITE\u更新限制-DSQLITE\u MAX\u SCHEMA\u RETRY=25-DSQLITE\u MAX\u VARIABLE\u NUMBER=250000-DSQLITE\u省略\u LOOKASIDE-DSQLITE\u SECURE\u DELETE-DSQLITE\u SOUNDEX-DSQLITE\u ENABLE\u EXPLAIN\u COMMENTS-DHAVE\u USLEEP-DHAVE\u READLINE-DHAVE\u ISNAN-DSQLITE\u LIKE\u不匹配\u BLOBS-DSQLITE\u线程安全=1-DSQLITE\u ENABLE\FTS4
    make OPTS=“$CFLAGS”
    gem安装sqlite3--详细--\
    --with-sqlite3-include=`readlink-f.`\
    --with-sqlite3-lib=`readlink-f.libs`\
    --使用cflags=“$cflags”
    
    可以通过via检查gem编译的sqlite版本

    需要'sqlite3'
    将SQLite3::SQLITE_版本#=>3.28.0
    
    或者尝试使用窗口功能:

    需要'sqlite3'
    需要“绝妙打印”
    db=SQLite3::Database.new(“:内存:”)
    db.results\u as\u hash=true
    db.execute我想使用Ubuntu18.10附带的SQLite 3.24.0中没有的,这里有一种编译SQLite 3.28.0的方法(Ubuntu19.04附带SQLite 3.27):

    #最好安装系统包,以确保您具有必要的依赖项:
    sudo-apt安装libsqlite3-dev
    wgethttps://sqlite.org/src/tarball/sqlite.tar.gz?r=release -O sqlite.tar.gz
    tar xzf sqlite.tar.gz
    mkdir构建
    光盘制作
    ../sqlite/configure
    export CFLAGS='-DSQLITE\u ENABLE\u COLUMN\u METADATA-DSQLITE\u ENABLE\u DBSTAT\u VTAB-DSQLITE\u ENABLE\u ENABLE\u LOAD\u EXTENSION-DSQLITE\u ENABLE\u PREUPDATE\u HOOK-DSQLITE\u ENABLE\u RTREE-DSQLITE\u ENABLE\u SESSION-DSQLITE\u STMTVTAB-DSQLITE\u ENABLE\u UNKNOWN\u SQL\u函数-DSQLITE\u ENABLE\u UNLOCK\u NOTIFY-DSQLITE\u更新限制-DSQLITE\u MAX\u SCHEMA\u RETRY=25-DSQLITE\u MAX\u VARIABLE\u NUMBER=250000-DSQLITE\u省略\u LOOKASIDE-DSQLITE\u SECURE\u DELETE-DSQLITE\u SOUNDEX-DSQLITE\u ENABLE\u EXPLAIN\u COMMENTS-DHAVE\u USLEEP-DHAVE\u READLINE-DHAVE\u ISNAN-DSQLITE\u LIKE\u不匹配\u BLOBS-DSQLITE\u线程安全=1-DSQLITE\u ENABLE\FTS4
    make OPTS=“$CFLAGS”
    gem安装sqlite3--详细--\
    --with-sqlite3-include=`readlink-f.`\
    --with-sqlite3-lib=`readlink-f.libs`\
    --使用cflags=“$cflags”
    
    可以通过via检查gem编译的sqlite版本

    需要'sqlite3'
    将SQLite3::SQ