質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

430閲覧

(WEBサーバー上)sqliteが混在していて古いバージョンが読まれてしまうので新しい方に切り替えたい。

daichans

総合スコア12

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/08/27 01:12

実現したいこと

WEBサイトにてAIでやりとりするページの導入対応をしておりまして
ローカルサーバーでPythonを利用した開発が完了し
WEBサーバーでの動作対応を行なっています。

その際にWEBサーバーのOSバンドルでインストールするsqliteが開発のものより古く
AIで利用しているchromadbが動作しなくなっております。
※chromadbの利用はsqlite3.35以上必要

新しいsqlite3.42を読み込むようにしたいです。

発生している問題・分からないこと

chromadbを動作させたく、
新しいsqliteをソースからインストールしたのですが
バンドルでインストールした古いsqlite3.26と、
ソースでインストールした新しいsqlite3.42が混在していて
Pythonにてsqliteを利用すると、古いバージョンが読まれてしまいます。

新しい方を読み込みをさせたい。
尚、root権限のbashファイルは一度壊してしまってログインをできなくしてしまったことがあるので
なるべくbashファイルは変更せず対応したいです。

▪️WEBサーバー情報
OS:AlmaLinux8
権限:rootなどなんでも

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

チャットGPTなどで調べたみたのですが
bashの設定を変更するものしかなく、bashの設定を変更せずに読み込むバージョンを変更したいです。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AbeTakashi

2024/08/27 01:49 編集

「bashの設定を変更」というのは環境変数のLD_LIBRARY_PATHに指定を追加するという意味でしょうか? python上のコードでLD_LIBRARY_PATHを変更するのは、セキュリティー的な問題があり難しいと言っている人がいるので、難しそうな気がします。 参考) https://gist.github.com/fortune/a0ea0bbb95802fc6e606b17d2821efc5 普通に追加するだけなら大きなトラブルになる可能性は限りなく低いと思うので、素直にLD_LIBRARY_PATHを追加されるのがベストじゃないかという気がします。
otn

2024/08/27 05:29

> チャットGPTなどで調べたみたのですがbashの設定を変更するものしかなく、bashの設定を変更せずに読み込むバージョンを変更したいです。 から推測すると、「なぜbashの設定を変更すると良いのか」を理解せずに進めようとしているのでは? 内容・意味を理解してから作業しましょう。 LD_LIBRARY_PATH の設定のことであれば、目的のプログラムの起動方法によっては、rootのbash設定ファイルを変更しても無意味です。 ウェブサーバーから起動されるPythonプログラムのようですが、 ・そのOSでは元のsqlite3は全く使わず、すべてのプログラムで新sqlite3を使う ・そのウェブサーバーから起動される全てのプログラムが、新sqlite3を使う ・そのウェブサーバーから起動される元のsqlite3を使うプログラムもある。Pythonプログラムでは全てで新sqlite3を使う ・そのウェブサーバーから起動される元のsqlite3を使うPythonプログラムもある。特定のPythonプログラムのみで新sqlite3を使う のどれでしょうか? また、ウェブサーバーの起動方法は?OS起動時にサービスとして起動するのか、人間がログインしてコマンドで起動するのか?コマンドならどんなコマンドで?
quickquip

2024/08/27 07:09 編集

sqlite3モジュールが実際どこのsqlite3を使うかは(普通には)Pythonのビルド時に決定され後から動かせないような気がします。 このあたり、Pythonのビルドは自分でしていて気を遣っていますか? (このようにPythonをビルドし直しました、という記載がないので気になりました) あとは https://pypi.org/project/pysqlite-binary/ を使うとか (pysqlite-binary がなぜあるの? とChatGPTなどなどに聞くと「sqlite3モジュールは、Pythonのビルド時にリンクされるSQLiteライブラリに依存する」と出てきます。幻覚の可能性はあります)
daichans

2024/08/27 08:22

>普通に追加するだけなら大きなトラブルになる可能性は限りなく低いと思うので、素直にLD_LIBRARY_PATHを追加されるのがベストじゃないかという気がします。 ありがとうございます!拝見させて頂きます!
daichans

2024/08/27 08:24

>「なぜbashの設定を変更すると良いのか」を理解せずに進めようとしているのでは? >内容・意味を理解してから作業しましょう。 >LD_LIBRARY_PATH の設定のことであれば、目的のプログラムの起動方法によっては、rootのbash設定>ファイルを変更しても無意味です。 ありがとうございます。色々省略してしまってすいません。こちらはroot接続時に読み込むsqliteのパスを変更するためにrootのbash設定を変更する予定でした。「export PATH=/usr/local/bin:$PATH」だけだとセッションが切れるたびに古い方を読んでしまうので。。 プログラム自体は そのウェブサーバーから起動される元のsqlite3を使うプログラムはなく、。Pythonプログラムでは全てで新sqlite3を使います。 WEBサーバーはOS起動時にサービスとして起動する形になります。 ※常に稼働している状態です。
daichans

2024/08/27 08:25

>sqlite3モジュールが実際どこのsqlite3を使うかは(普通には)Pythonのビルド時に決定され後から動かせないような気がします。 >このあたり、Pythonのビルドは自分でしていて気を遣っていますか? (このようにPythonをビルドし直しました、という記載がないので気になりました) ありがとうございます。実は再ビルドも試したのですが、それでもダメで。。いっそ元入ってるsqlit3消そうかと思っています。
quickquip

2024/08/27 09:07 編集

> 実は再ビルドも試したのですが、それでもダメで mac+pyenvの話ですが export CFLAGS="-I$(brew --prefix sqlite3)/include" export LDFLAGS="-L$(brew --prefix sqlite3)/lib" pyenv install 3.12.xx としてシステムsqlite3からHomebrewのsqlite3に切り替わる(python -m sqlite3 -v のバージョンが変わる)くらいの確認はできてます LD_LIBRARY_PATHでは切り替わらないんじゃないか(もしくはそのために専用のビルドオプションが要るくらいの話だったんじゃないか)という記憶ではあります…
melian

2024/08/27 09:52 編集

手元の環境は Ubuntu 24.04/Python3.12 ですが、sqlite3 モジュールをロードする際には、 /usr/lib/python3.12/sqlite3/__init__.py が読み込まれて、次に sqlite3.dbapi2 モジュールがロードされます。 from sqlite3.dbapi2 import * sqlite3.dbapi2 は /usr/lib/python3.12/sqlite3/dbapi2.py ですが、この中の、 from _sqlite3 import * 部分で共有ライブラリ(shared object)がロードされます。 $ python3 Python 3.12.3 (main, Jul 31 2024, 17:43:48) [GCC 13.2.0] on linux >>> import _sqlite3 >>> _sqlite3 <module '_sqlite3' from '/usr/lib/python3.12/lib-dynload/_sqlite3.cpython-312-x86_64-linux-gnu.so'> この _sqlite3.cpython-312-x86_64-linux-gnu.so ライブラリと依存関係にあるライブラリを表示してみると以下の様になります。 $ ldd /usr/lib/python3.12/lib-dynload/_sqlite3.cpython-312-x86_64-linux-gnu.so                :  libsqlite3.so.0 => /lib/x86_64-linux-gnu/libsqlite3.so.0 (0x0000765f96a58000)                : LD_LIBRARY_PATH を設定する以外に、共有ライブラリに DT_RUNPATH を埋め込む方法があります。具体的には patchelf コマンドを利用します。(sqlite3 3.46.1 の共有ライブラリが /opt/local/lib にインストールされています) # cd /usr/lib/python3.12/lib-dynload/ # cp -pv _sqlite3.cpython-312-x86_64-linux-gnu.so _sqlite3.cpython-312-x86_64-linux-gnu.so.org # patchelf --set-rpath /opt/local/lib _sqlite3.cpython-312-x86_64-linux-gnu.so # patchelf --print-rpath _sqlite3.cpython-312-x86_64-linux-gnu.so /opt/local/lib # ldd _sqlite3.cpython-312-x86_64-linux-gnu.so                :  libsqlite3.so.0 => /opt/local/lib/libsqlite3.so.0 (0x00007600c04fa000)                : 手元の Ubuntu にインストールされている sqlite3 のバージョンは 3.45.1 です。DT_RUNPATH を設定する前は、 $ python3 -c 'import sqlite3;print(sqlite3.sqlite_version)' 3.45.1 設定後は以下の通り(3.46.1)です。 $ python3 -c 'import sqlite3;print(sqlite3.sqlite_version)' 3.46.1
guest

回答1

0

ベストアンサー

環境変数LD_LIBRARY_PATHの設定で解決する前提で回答します。

そのウェブサーバーから起動される元のsqlite3を使うプログラムはなく、。Pythonプログラムでは全てで新sqlite3を使います。
WEBサーバーはOS起動時にサービスとして起動する形になります。

と言うことであれば、サービスの設定ファイル/usr/lib/systemd/system/httpd.serviceで、環境変数を設定する([Service]のセクションに、Environment=LD_LIBRARY_PATH=/xxx/xxx/xxxを追加)
のが良いかと思ったのですが、このファイルはdnf updateで上書きされるはず。

/etcの下(/etc/systemd/system/httpd.service)に置いて上書きを避ける方法もあるようなのですが、そうすると、/usr/lib/systemd/system/httpd.serviceの内容にアップデートがあれば、必要な物を自分で選択して/etc側に反映しないといけない。何かうまい手があるのかも知れませんが。

別解としては、Apacheなら、confファイルの適切な場所に、SetEnv LD_LIBRARY_PATH /xxx/xxx/xxxを追加するか。こっちの方が、簡単かも知れません。
もし、特定のプログラムのみと前提が変わった場合にも<Files等で対象を絞れるし。

回答はここまで。

こちらはroot接続時に読み込むsqliteのパスを変更するためにrootのbash設定を変更する予定でした。「export PATH=/usr/local/bin:$PATH」だけだとセッションが切れるたびに古い方を読んでしまうので。。

というのは、

尚、root権限のbashファイルは一度壊してしまってログインをできなくしてしまったことがあるので

という今回の質問と関係ない話のことですかね?
私の書いた、

から推測すると、「なぜbashの設定を変更すると良いのか」を理解せずに進めようとしているのでは?
内容・意味を理解してから作業しましょう。

というのは、「採用したくない案であるが、bashの設定を変更するのが今回の問題に解決になる」と思っちゃったことが、その解決法の書いてあったページに書いてあった内容・意味を理解していないという指摘です。
そのページは、「bashのコマンドラインから起動するPythonプログラムの利用するsqlite3を変えたい」という目的だったのでしょう。

WEBサーバーはOS起動時にサービスとして起動する形になります。

であれば、rootのbash設定ファイルでの環境変数設定は何の関係もありません。
rootでログインして、/usr/sbin/httpd ~~~というコマンドをbashコマンドラインから入力して起動するなら関係あるかもしれませんが、普通はそんな起動はしない。

投稿2024/08/27 10:10

編集2024/08/27 10:13
otn

総合スコア85647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daichans

2024/08/28 09:32

ありがとうございます!一度試してみます! >その解決法の書いてあったページに書いてあった内容・意味を理解していないという指摘です。 >そのページは、「bashのコマンドラインから起動するPythonプログラムの利用するsqlite3を変えたい」 >という目的だったのでしょう。 その通りです。全てを理解せずに進めていたと実感しております。。
daichans

2024/08/29 09:10 編集

ご指摘いただきました通り、 usr/lib/systemd/system/httpd.serviceにて Environment="LD_LIBRARY_PATH=/usr/local/lib"を[Service]に設定しました所 起動することができました! ベストアンサーに選ばせていただきました! ありがとうございました!
otn

2024/08/29 10:25 編集

/usr/lib/systemd/system/httpd.service を修正したのであれば、回答に書いたとおり、httpdのアップデートで変更は上書きされるはずなので、 ・httpdは今後アップデートしない ・httpdのアップデートがあったらまた修正する のどちらにするかですね。 手動で確認し奈良殻のアップデートなら後者で十分だと思いますが(忘れなければ)。
daichans

2024/10/15 12:49

ありがとうございました! bashでみると python3 -c 'import sqlite3;print(sqlite3.sqlite_version)' になっていますがエラーがでていないのでWEB経由でも問題なく最新版がよまれているかと思います!
otn

2024/10/15 14:46

説明したことが理解されていない気がします。 (1) rootでログインした時の環境変数 (2) OS起動時にサービスで起動されたプロセスの環境変数 は無関係なので、(1)で確認しても、(2)の確認にはなりません。それぞれ別々に確認が必要です。 /usr/lib/systemd/system/httpd.service の修正が正しくて、ウェブプログラム上で問題ないなら、それでよくて、rootでログインして確認する意味はありません。 あえて、明示的に確認するなら、ウェブアプリ内で、sqlite3.sqlite_version を表示するなどします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問