อะไรคือความแตกต่างระหว่าง MySQLdb, mysqlclient และ MySQL connector / Python?


94

ดังนั้นฉันจึงพยายามอัปเดตฐานข้อมูลด้วย python และในขณะที่ตั้งค่าสภาพแวดล้อม dev ทั้งหมดฉันเจอสามสิ่งนี้ซึ่งทำให้ฉันเวียนหัว

  1. มีMySQLdb

  2. มีmysqlclient

  3. แล้วก็มีpython ตัวเชื่อมต่อ mysql

แต่ละอย่างแตกต่างกันอย่างไรและใช้ที่ไหน? ขอบคุณ


1
ภาษาส่วนใหญ่มีเลเยอร์อะแด็ปเตอร์ฐานข้อมูลหลายระดับซึ่งมีระดับความซับซ้อนการสนับสนุนและคุณภาพที่แตกต่างกัน
tadman

mysqlclient เป็น MySQLdb เวอร์ชันแยกที่มีการสนับสนุน python3.3 + และตัวเชื่อมต่อ mysql เป็นโมดูลทางการจาก mysql
warungman

3
นอกจากนี้เรายังมี pymysql
Cenk Alti

คำตอบ:


82

MySQLdbเป็นเครื่องห่อ python แบบบางรอบ ๆ โมดูล C ซึ่งใช้ API สำหรับฐานข้อมูล MySQL

มีการใช้กระดาษห่อรุ่นMySQLDb1เมื่อนานมาแล้วและตอนนี้ถือว่าเป็นมรดกตกทอด เมื่อ MySQLDb1 เริ่มพัฒนาเป็นMySQLDb2ด้วยการแก้ไขข้อบกพร่องและการสนับสนุน Python3 MySQLDb1 จึงถูกแยกออกและนี่คือลักษณะที่mysqlclientปรากฏขึ้นพร้อมการแก้ไขข้อบกพร่องและการสนับสนุนPython3 สรุปแล้วตอนนี้เรามี MySQLDb2 ซึ่งยังไม่พร้อมสำหรับการใช้งานจริง MySQLDb1 เป็นไดรเวอร์ที่ล้าสมัยและชุมชนรองรับ mysqlclient ด้วยการแก้ไขข้อบกพร่องและการสนับสนุน Python3

ตอนนี้เพื่อแก้ปัญหานี้ MySQL มีอะแดปเตอร์ MySQL เวอร์ชันของตัวเอง - ตัวเชื่อมต่อ mysqlซึ่งเป็นโมดูล python แบบ all-in ที่ใช้ MySQL API โดยไม่มีการพึ่งพาโมดูล Cและใช้เฉพาะโมดูล Python มาตรฐานเท่านั้น

ดังนั้นคำถามจึงลงมาที่: mysqlclient vs mysql connector

สำหรับฉันฉันจะใช้ไลบรารีที่รองรับอย่างเป็นทางการ แต่mysqlclientก็น่าจะเป็นทางเลือกที่ดีเช่นกัน ทั้งสองกำลังได้รับการอัปเดตการแก้ไขและคุณลักษณะใหม่ ๆ ซึ่งคุณสามารถเห็นได้จากการกระทำที่ใช้งานอยู่ในช่วงไม่กี่วัน

หมายเหตุ: ฉันไม่มีประสบการณ์กับพวกเขามากนักดังนั้นอาจมีบางกรณีที่ไม่ตรงกับความต้องการของคุณ ไลบรารีทั้งสองเป็นไปตามมาตรฐานPEP-249ซึ่งหมายความว่าคุณควรมีฟังก์ชันพื้นฐานอย่างน้อยทุกที่

การติดตั้งและการขึ้นต่อกัน

  • mysqlclient

ในฐานะที่เป็นทางแยกของ C wrapper ต้องใช้โมดูล C เพื่อทำงานกับ MySQL ซึ่งจะเพิ่มไฟล์ส่วนหัว python เพื่อสร้างส่วนขยายเหล่านี้ (อ่าน python-dev) การติดตั้งขึ้นอยู่กับระบบที่คุณใช้เพียงตรวจสอบให้แน่ใจว่าคุณทราบชื่อแพ็กเกจและสามารถติดตั้งได้


70

มีอะแดปเตอร์ MySQL สำหรับ Python ที่ดูแลอยู่ในปัจจุบัน:

  • mysqlclient- ตัวเชื่อมต่อ MySQL ที่เร็วที่สุดสำหรับ CPython ต้องการmysql-connector-cไลบรารี C ในการทำงาน

  • PyMySQL- ไคลเอนต์ Pure Python MySQL ตามผู้ดูแลของทั้งสองmysqlclientและPyMySQLคุณควรใช้PyMySQLหาก:

    • คุณไม่สามารถใช้libmysqlclientด้วยเหตุผลบางประการ
    • คุณต้องการใช้ Monkeypatched ซ็อกเก็ตของ gevent หรือ eventlet
    • คุณไม่ต้องการแฮ็กโปรโตคอล mysql
  • mysql-connector-python- ตัวเชื่อมต่อ MySQL ที่พัฒนาโดยกลุ่ม MySQL ที่ Oracle ซึ่งเขียนด้วย Python ทั้งหมด ดูเหมือนว่าประสิทธิภาพจะแย่ที่สุดในสามอย่าง นอกจากนี้เนื่องจากปัญหาการออกใบอนุญาตบางประการคุณไม่สามารถดาวน์โหลดได้จาก PyPI (แต่ตอนนี้สามารถใช้งานได้ผ่าน conda)

เกณฑ์มาตรฐาน

ตามเกณฑ์มาตรฐานต่อไปmysqlclientนี้เร็วกว่า (บางครั้ง> เร็วกว่า 10 เท่า) เมื่อเทียบกับไคลเอนต์ Python แท้


2
ดูเหมือนว่าPyMySQLยังคงเป็นวิธีที่จะไปถ้าใช้ PyPy
radtek

ในกรณีที่คุณมีปัญหาในการรวบรวม mysqlclient คุณสามารถติดตั้งผ่านแพ็คเกจล้อตามที่อธิบายไว้ที่นี่: stackoverflow.com/a/31077052/2848256
ИскренСтаниславов

sqlalchemy รองรับ mysqlclient หรือไม่
vishal

4
@vishal AFAIK mysqlclientเป็นตัวเชื่อมต่อเริ่มต้นที่ใช้โดย sqlalchemy เมื่อ URL mysql://...ของฐานข้อมูลของคุณจะเริ่มต้นด้วย ในการใช้งานPyMySQLให้เริ่มต้น URL ของคุณด้วยmysql+pymysql://.... ในการใช้งานmysql-connector-pythonให้เริ่มต้น URL ของคุณด้วยmysql+mysqlconnector://.... ดูเอกสาร sqlalchemyสำหรับข้อมูลเพิ่มเติม
ostrokach

12

ตัวเลือกมากมายจากผู้ใช้ สายไปหน่อย แต่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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.