Node.jsでSQLiteを使用する3番目のBaihuistの方法の理由と利点

Zen Pythonの持ち主は、目的を達成するための明白な方法が1つ(できれば1つだけ )あるべきだと考えています。



Node.jsモジュールリストを取得した人は、これらのモジュールの作成者が禅仏教徒では なく、 バイフイスト -1957年に毛沢東が古典中国語に基づいて宣言した白華雲洞運動(百花运动)のファンに精神的に近いことを確信できます詩 「百花」、 「百花という言葉で始まる「百花を咲かせ、百学校を競わせます」。 言い換えれば、Node.jsのモジュールは、原則として、同じことを行うためのいくつかの方法を提供し、それらから消費者は自分に最も適した方法を選択します。



しかし、なぜ誰にとっても適切な方法がひとつもないのでしょうか?



SQLiteデータベースの使用例を使用して、この質問に対する答えを検討することを提案します。



Node.jsエンジン( JSDBなどとは異なります )には、SQLiteデータベースにアクセスするための組み込みツールがなく、サードパーティのモジュールに実装を提供します。 これらの中で最も人気のあるものは、有名なマッピング会社MapBoxによってサポートされているsqlite3モジュールです。 npm 統計よる 、月何万ものダウンロードがあります。



彼を熱心に見ると、この人気のあるモジュールのコードは完全にjavascriptではないことが簡単にわかります。 これは、ソース(ソース) SQLiteコードをNode用のコンパイル済みアドオンとして接続することに基づいています。 これがモジュールの幅広い適合性の理由ではありません。LinuxおよびMac OS Xの場合、プログラムを構築するためのツールが豊富にありますが、Windowsの場合、 node-gyp要件を満たす必要性非常に苦痛です。 特別な問題は、アドオンのビルドにMicrosoft Visual Studio C ++ 2010 (無料のExpressバージョンも適しています)だけでなく、Windows 7 64ビットSDKの ISOイメージが 570以上を必要とする64ビットバージョンのWindowsです。 メガバイト。



この不便さに応えて、NodeでSQLiteを使用する2番目の方法が登場しました-node-sqlite-purejsモジュール。Nodeエンジンによって直接実行される純粋なjavascriptで構成される(モジュール名に反映される)ため、コードがアセンブリを必要としません。 このコードは、Alon Zakai(Emscriptenの作成者)がEmscriptenを介してSQLiteコードを渡すことで受け取ったSQL.jsスクリプトに基づいています。この成果は、昨年(2012年)3月にHabrahabrで言及しました。



残念ながら、Cモジュールの欠如はこのモジュールのほとんど唯一の利点です。安定性の点ではるかに良いことを期待しており、未解決の問題のリストにはデータ損失とソフトシャットダウンの不可能性が含まれます。 これはすべて、CからJavaScriptへの自動変換のプロセスで、トランザクション原子性が明らかに失われたためです。これは、SQLiteの主な有用なプロパティです。 この問題が解決するまで、悲しいことに、この2番目の方法は行き止まりであると考えることができます。



最近(先週の日曜日-10月27日)、nodejs Googleグループで、NodeでSQLiteを使用する3番目の方法の出現について読むことが可能なりました。前任者の両方の主な欠点はありません。 この新しいモジュール opendatabase )には、javascriptまたはjavascript形式のSQLiteコードが含まれていません-代わりに、古き良きコマンドラインインターフェイスを介してsqliteプログラム(Windowsではsqlite.exeと呼ばれます)を呼び出し、 SQLクエリをダンプしてjavascriptで解析します彼女の反応。



このモジュールは、コンパイルおよびアセンブリ用のツールを必要としないことは容易に推測できます(mapboxモジュールsqlite3が必要でした)。既製の形式でSQLite Webサイトからsqliteプログラムをダウンロードするだけで十分です。 同じ理由で、不完全な実装でも問題はありません(node-sqlite-purejsで観察されます ):ダウンロードされたプログラムには公式の実装が含まれています。



だからこそ、このモジュールで私は、バイホイストの多様性と共栄の原則の勝利を見て、中国の イブ・ イブディ・フイダオ・ムディ 」の正しさをもう一度確認します。



当分の間、この3番目のモジュールを非難できるのは、 BitbucketとMercurialのソースの場所のみです(他のほとんどのNodeモジュールのようにGithubとGitではありません)。これは私にとっては珍しいことです(つまり、gibletsと機能の知識が複雑になります)モジュール、それ以上の開発を追跡することを困難にします)。 他のプログラマー(BitbucketとMercurialに精通している)は、おそらくこの欠点を重要なものとは思わないでしょう(しかし、ソースを見ると、おそらく私がまだ知らない他の欠点を見つけるでしょう)。 このモジュールのソースコードはまだ読んでいないので、ここで私の話は終わりです。



All Articles