ดังนั้นฉันจึงพยายามอัปเดตฐานข้อมูลด้วย python และในขณะที่ตั้งค่าสภาพแวดล้อม dev ทั้งหมดฉันเจอสามสิ่งนี้ซึ่งทำให้ฉันเวียนหัว
มีMySQLdb
- แล้วก็มีpython ตัวเชื่อมต่อ mysql
แต่ละอย่างแตกต่างกันอย่างไรและใช้ที่ไหน? ขอบคุณ
ดังนั้นฉันจึงพยายามอัปเดตฐานข้อมูลด้วย python และในขณะที่ตั้งค่าสภาพแวดล้อม dev ทั้งหมดฉันเจอสามสิ่งนี้ซึ่งทำให้ฉันเวียนหัว
มีMySQLdb
แต่ละอย่างแตกต่างกันอย่างไรและใช้ที่ไหน? ขอบคุณ
คำตอบ:
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ซึ่งหมายความว่าคุณควรมีฟังก์ชันพื้นฐานอย่างน้อยทุกที่
การติดตั้งและการขึ้นต่อกัน
ในฐานะที่เป็นทางแยกของ C wrapper ต้องใช้โมดูล C เพื่อทำงานกับ MySQL ซึ่งจะเพิ่มไฟล์ส่วนหัว python เพื่อสร้างส่วนขยายเหล่านี้ (อ่าน python-dev) การติดตั้งขึ้นอยู่กับระบบที่คุณใช้เพียงตรวจสอบให้แน่ใจว่าคุณทราบชื่อแพ็กเกจและสามารถติดตั้งได้
มีอะแดปเตอร์ MySQL สำหรับ Python ที่ดูแลอยู่ในปัจจุบัน:
mysqlclient
- ตัวเชื่อมต่อ MySQL ที่เร็วที่สุดสำหรับ CPython ต้องการmysql-connector-c
ไลบรารี C ในการทำงาน
PyMySQL
- ไคลเอนต์ Pure Python MySQL ตามผู้ดูแลของทั้งสองmysqlclient
และPyMySQL
คุณควรใช้PyMySQL
หาก:
libmysqlclient
ด้วยเหตุผลบางประการmysql-connector-python
- ตัวเชื่อมต่อ MySQL ที่พัฒนาโดยกลุ่ม MySQL ที่ Oracle ซึ่งเขียนด้วย Python ทั้งหมด ดูเหมือนว่าประสิทธิภาพจะแย่ที่สุดในสามอย่าง นอกจากนี้เนื่องจากปัญหาการออกใบอนุญาตบางประการคุณไม่สามารถดาวน์โหลดได้จาก PyPI (แต่ตอนนี้สามารถใช้งานได้ผ่าน conda)
ตามเกณฑ์มาตรฐานต่อไปmysqlclient
นี้เร็วกว่า (บางครั้ง> เร็วกว่า 10 เท่า) เมื่อเทียบกับไคลเอนต์ Python แท้
PyMySQL
ยังคงเป็นวิธีที่จะไปถ้าใช้ PyPy
mysqlclient
เป็นตัวเชื่อมต่อเริ่มต้นที่ใช้โดย sqlalchemy เมื่อ URL mysql://...
ของฐานข้อมูลของคุณจะเริ่มต้นด้วย ในการใช้งานPyMySQL
ให้เริ่มต้น URL ของคุณด้วยmysql+pymysql://...
. ในการใช้งานmysql-connector-python
ให้เริ่มต้น URL ของคุณด้วยmysql+mysqlconnector://...
. ดูเอกสาร sqlalchemyสำหรับข้อมูลเพิ่มเติม
ตัวเลือกมากมายจากผู้ใช้ สายไปหน่อย แต่2 เซ็นต์ของฉันอยู่ในการเปรียบเทียบสำหรับรุ่น pypy 3.7
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