web-dev-qa-db-ja.com

MySQLdb、mysqlclient、MySQL connector / Pythonの違いは何ですか?

だから私はpythonを使ってデータベースの更新を行おうとしており、開発環境全体をセットアップしているときに、これら3つのことに出会い、めまいがした。

  1. MySQLdb があります

  2. mysqlclient があります

  3. そして、 mysql connector python があります

それらのそれぞれは何ですか、違いとそれらをどこで使用しますか?ありがとう

53
आनंद

MySQLdb は、MySQLデータベースのAPIを実装するCモジュールの薄いpythonラッパーです。

しばらく前に MySQLDb1 バージョンのラッパーが使用されていましたが、現在はレガシーと見なされています。 MySQLDb1がバグ修正とPython3サポートにより MySQLDb2 に進化し始めると、MySQLDb1が分岐し、バグ修正とPython3サポートにより mysqlclient がどのように出現したかがわかります。まとめると、現在、実稼働で使用する準備が整っていないMySQLDb2、古いドライバーとしてのMySQLDb1、およびバグ修正とPython3サポートを備えたmysqlclientをサポートするコミュニティーがあります。

今、その混乱を解決するために、MySQLは独自のバージョンのMySQLアダプターを提供します- mysql connectorno CモジュールでMySQL APIを使用するオールインpythonモジュール依存関係および標準pythonモジュールのみが使用されます。

したがって、質問は次のようになります:mysqlclient vs mysql connector。

私に関しては、公式にサポートされているライブラリを使用しますが、mysqlclientも適切な選択です。両方とも、直近のアクティブなコミットで確認できる修正および新機能で積極的に更新されています。

注:あまり経験がなかったため、ニーズに合っていない場合があります。両方のライブラリは PEP-249 標準に準拠しているため、少なくとも基本機能はどこでも使用できます。

インストールと依存関係

  • mysqlclient

Cラッパーのフォークとして、MySQLで動作するCモジュールが必要です。MySQLはpythonヘッダーファイルを追加してこれらの拡張機能を作成します(python-devを参照)。インストールは使用するシステムによって異なります。パッケージ名を認識してインストールできることを確認してください。

54
Taras Matsyk

現在維持されているPython用のMySQLアダプターが3つあります。

  • mysqlclient -CPython用の群​​を抜いて最速のMySQLコネクタ。動作するにはmysql-connector-c Cライブラリが必要です。

  • PyMySQL -Pure Python MySQLクライアント。 mysqlclientPyMySQL の両方のメンテナーによると、次の場合はPyMySQLを使用する必要があります。

    • 何らかの理由でlibmysqlclientを使用できません。
    • Geventまたはeventletのmonkeypatchedソケットを使用します。
    • Mysqlプロトコルをハックしたくない。
  • mysql-connector-python -OracleのMySQLグループによって開発されたMySQLコネクタで、完全にPythonで記述されています。そのパフォーマンスは3つの中で最悪のようです。また、ライセンスの問題により、PyPIからダウンロードすることはできません(ただし、condaを介して利用可能になりました)。

ベンチマーク

以下のベンチマークによると、mysqlclientは、純粋なPythonクライアントよりも高速です(10倍以上高速になる場合があります)。

34
ostrokach

ユーザーが提供する多くのオプション。パーティーに少し遅れました。しかし、私の2セント pypy 3.7バージョンのベンチマークで。

より高速なアクセスと繰り返しアクセスが必要な場合は、mysqlclientに固執する

MySQL Connector/Python: 23.096168518066406 [sec]
mysqlclient: 6.815327882766724 [sec]
PyMySQL: 24.616853952407837 [sec]
MySQL Connector/Python: 22.619106769561768 [sec]
mysqlclient: 6.607790231704712 [sec]
PyMySQL: 24.410773038864136 [sec]

ループ...前のベンチマークから...

def q100k(cur):
    t = time.time()
    for _ in range(100000):
        cur.execute("SELECT 1,2,3,4,5,6")
        res = cur.fetchall()
        assert len(res) == 1
        assert res[0] == (1, 2, 3, 4, 5, 6)
    return time.time() - t
3
Doogle