ฉันจะเชื่อมต่อกับฐานข้อมูล MySQL ใน Python ได้อย่างไร


1163

ฉันจะเชื่อมต่อกับฐานข้อมูล MySQL โดยใช้โปรแกรมไพ ธ อนได้อย่างไร


44
คำตอบส่วนใหญ่ที่นี่มุ่งเน้นไปที่การติดตั้งไลบรารี MySQLdb ฉันอยากจะแนะนำให้เลือกใช้ตัวเชื่อมต่อ MySQL / Python จาก MySQL / Oracle ซึ่งทำให้กระบวนการง่ายขึ้นมาก: stackoverflow.com/questions/372885/ …
คุณ Napik

8
ปัญหาของการใช้ Connector / Python ของ Oracle คือมีข้อบกพร่องเล็กน้อยและปัญหาการรวมอื่น ๆ ติดตั้งง่าย แต่แทบจะเป็นไปไม่ได้เลยที่จะได้ทำงานให้กับเคสที่ใช้งานจริงทั้งหมดที่ฉันได้ลองใช้ ดังนั้นทำไมฉันแนะนำ MySQLdb เสมอ
Joe C.

7
@ Mr.Napik ฉันใช้pymysqlเพราะมันเป็น Python ฟรีที่บริสุทธิ์ตามการเปรียบเทียบนี้
Cees Timmerman

คำตอบ:


1246

การเชื่อมต่อกับ MySQL ด้วย Python 2 ในสามขั้นตอน

1 - การตั้งค่า

คุณต้องติดตั้งไดรเวอร์ MySQL ก่อนทำอะไร แตกต่างจาก PHP มีเพียงไดรเวอร์ SQLite เท่านั้นที่ติดตั้งตามค่าเริ่มต้นด้วย Python แพ็คเกจที่ใช้บ่อยที่สุดคือMySQLdbแต่ยากที่จะติดตั้งโดยใช้ easy_install โปรดทราบว่า MySQLdb รองรับ Python 2 เท่านั้น

สำหรับผู้ใช้ Windows คุณสามารถรับMySQLdbได้

สำหรับ Linux นี่เป็นแพ็คเกจชั่วคราว (python-mysqldb) (คุณสามารถใช้sudo apt-get install python-mysqldb(สำหรับ distros based debian), yum install MySQL-python(สำหรับ rpm-based) หรือdnf install python-mysql(สำหรับ fedora distro ที่ทันสมัย) ในบรรทัดคำสั่งเพื่อดาวน์โหลด)

สำหรับ Mac คุณสามารถติดตั้ง MySQLdb ใช้ Macport

2 - การใช้งาน

หลังจากติดตั้งแล้วให้รีบูท นี่ไม่ใช่ข้อบังคับ แต่มันจะป้องกันไม่ให้ฉันตอบคำถามอื่น 3 หรือ 4 ข้อในโพสต์นี้หากมีสิ่งผิดปกติเกิดขึ้น ดังนั้นโปรดรีบูต

จากนั้นมันก็เหมือนกับการใช้แพคเกจอื่น ๆ :

#!/usr/bin/python
import MySQLdb

db = MySQLdb.connect(host="localhost",    # your host, usually localhost
                     user="john",         # your username
                     passwd="megajonhy",  # your password
                     db="jonhydb")        # name of the data base

# you must create a Cursor object. It will let
#  you execute all the queries you need
cur = db.cursor()

# Use all the SQL you like
cur.execute("SELECT * FROM YOUR_TABLE_NAME")

# print all the first cell of all the rows
for row in cur.fetchall():
    print row[0]

db.close()

แน่นอนว่ามีความเป็นไปได้และทางเลือกนับพันรายการ นี่เป็นตัวอย่างพื้นฐานมาก คุณจะต้องดูเอกสารประกอบ เป็นจุดเริ่มต้นที่ดี

3 - การใช้งานขั้นสูงเพิ่มเติม

เมื่อคุณรู้วิธีการทำงานคุณอาจต้องการใช้ORMเพื่อหลีกเลี่ยงการเขียน SQL ด้วยตนเองและจัดการตารางของคุณเนื่องจากเป็นวัตถุ Python ออมที่มีชื่อเสียงที่สุดในชุมชนงูหลามเป็นSQLAlchemy

ฉันขอแนะนำให้คุณใช้: ชีวิตของคุณจะง่ายขึ้นมาก

ฉันเพิ่งค้นพบอัญมณีอื่นในโลกหลาม: แคระ มันเป็น ORM ที่ยอดเยี่ยมมากติดตั้งและใช้งานง่ายและรวดเร็ว มันทำให้วันของฉันสำหรับโครงการขนาดเล็กหรือแอปสแตนด์อะโลนซึ่งการใช้เครื่องมือขนาดใหญ่เช่น SQLAlchemy หรือ Django นั้นเกินความจริง:

import peewee
from peewee import *

db = MySQLDatabase('jonhydb', user='john', passwd='megajonhy')

class Book(peewee.Model):
    author = peewee.CharField()
    title = peewee.TextField()

    class Meta:
        database = db

Book.create_table()
book = Book(author="me", title='Peewee is cool')
book.save()
for book in Book.filter(author="me"):
    print book.title

ตัวอย่างนี้ใช้ได้นอกกรอบ ไม่มีสิ่งใดนอกจากการมี peewee ( pip install peewee)


46
ดีใจที่คุณชอบ peewee !! ฉันได้เพิ่มการสนับสนุนสำหรับ MySQL รวมถึงเอกสารบางอย่างเกี่ยวกับการรวมเข้ากับมัน แฮ็คมีความสุข!
coleifer

14
หมายเหตุขณะที่เขียนสิ่งนี้ MySQLdb ไม่รองรับ Python 3 หน้า sourceforge ระบุว่า "Python 3 รองรับเร็ว ๆ นี้" แต่ยังไม่ได้รับการอัปเดตตั้งแต่ 2012-10-08 สำหรับ Python 3 นั้นมีPyMySQLและsql ของเรา
paul

8
โปรดทราบว่าต้องมีสิ่งต่อไปนี้:pip install MySQL-python
เบ็นโครว์เฮิร์สต์

5
คำตอบนี้จะเป็นประโยชน์มากขึ้นด้วยการเชื่อมต่อตัวอย่างกับเซิร์ฟเวอร์ภายนอกบนพอร์ตที่ไม่ได้มาตรฐานเพื่อแสดงวิธีการทำ การบอก localhost เป็นวิธีปกติในการทำเรื่องไร้สาระ
แอนโธนี

3
Peewee มีการเปลี่ยนแปลงพฤติกรรมเริ่มต้นและไม่ได้ใช้ autocommit โดยค่าเริ่มต้นอีกต่อไป แม้แต่สถานการณ์ไดรเวอร์ฐานข้อมูลก็เปลี่ยนไป คำถามจำเป็นต้องได้รับการอัปเดต แต่เนื่องจากการแก้ไขในคำตอบของฉันไม่เหมาะสมฉันจึงไม่แก้ไขอีกต่อไป
E-satis

189

นี่คือวิธีหนึ่งในการใช้MySQLdbซึ่งรองรับ Python 2 เท่านั้น:

#!/usr/bin/python
import MySQLdb

# Connect
db = MySQLdb.connect(host="localhost",
                     user="appuser",
                     passwd="",
                     db="onco")

cursor = db.cursor()

# Execute SQL select statement
cursor.execute("SELECT * FROM location")

# Commit your changes if writing
# In this case, we are only reading data
# db.commit()

# Get the number of rows in the resultset
numrows = cursor.rowcount

# Get and display one row at a time
for x in range(0, numrows):
    row = cursor.fetchone()
    print row[0], "-->", row[1]

# Close the connection
db.close()

อ้างอิงที่นี่


4
จำเป็นต้องคอมมิทในตัวอย่างนี้เมื่อคุณไม่ได้แก้ไขฐานข้อมูลหรือไม่?
sumanth232

3
ระวัง - โมดูลนี้ไม่มีการสนับสนุนเขตเวลาในการเชื่อมต่อ
kommradHomer

มันไม่ทำงานบนโฮสติ้งที่ใช้ร่วมกันของฉัน No module named MySQLdbบอกว่า ฉันจะใช้ mysql กับ python บนโฮสติ้งที่ใช้ร่วมกันได้อย่างไร ทางเลือกใด ๆ
Bhavesh Gangani

@BhaveshGangani คุณจะต้องติดต่อโฮสต์ของคุณและถามว่าทำไมคลัง Python จึงสนับสนุน หากพวกเขาสนับสนุน pypi คุณสามารถโหลดแพ็คเกจได้ตลอดเวลาเมื่อการปรับใช้ของคุณเกิดขึ้น
George Stocker

1
ที่น่าสนใจถึงแม้ว่า docs จะบอกว่าใช้งานได้กับ python 2 เท่านั้น แต่ดูเหมือนว่ามันจะใช้งานกับ python 3 ได้สำหรับฉัน
lucidbrot

122

ขณะนี้ Oracle (MySQL) สนับสนุนตัวเชื่อมต่อ Python อย่างแท้จริง นั่นหมายความว่าไม่มีไบนารี่ที่จะติดตั้ง: มันเป็นเพียงห้องสมุด Python มันเรียกว่า "Connector / Python"

http://dev.mysql.com/downloads/connector/python/


1
เร็วกว่าใช้ mysqldb หรือไม่
alwbtc

8
ใช่แล้ว. นอกจากนี้ยังมีความยุ่งยากน้อยกว่า MySQLdb และ API ในความคิดของฉันดีกว่า นี่ควรเป็นคำตอบ
แอนโธนี

1
การใช้ตัวเชื่อมต่อ mysql อย่างเป็นทางการของ python เป็นวิธีที่ดีที่สุดในการชนะเวลา
Anas

2
@ J0hnG4lt คุณสามารถคลิกที่ "ไม่เป็นไรเพิ่งเริ่มดาวน์โหลดของฉัน" ใต้แบบฟอร์มเข้าสู่ระบบ (ซึ่งจริง ๆ แล้วดูเหมือนจะบังคับ แต่ไม่ใช่)
ComFreek

6
@ComFreek ที่ดี มันดีกว่ากันยังไง? เราจะหยุดใช้ "เวิร์กโฟลว์ Windows" ได้ไหม มีการจัดการแพ็คเกจอยู่
J0hnG4lt

120

ถ้าคุณไม่จำเป็นต้อง MySQLdb แต่จะยอมรับห้องสมุดใด ๆ ฉันจะมากมากแนะนำ MySQL Connector / หลามจาก MySQL: http://dev.mysql.com/downloads/connector/python/

เป็นแพ็คเกจเดียว (ประมาณ 110k), Pure Python ดังนั้นมันจึงเป็นระบบอิสระและติดตั้งได้ง่าย คุณเพิ่งดาวน์โหลดดับเบิลคลิกยืนยันข้อตกลงสิทธิ์การใช้งานและไป ไม่จำเป็นต้องมี Xcode, MacPorts, การรวบรวม, การเริ่มต้นใหม่ ...

จากนั้นคุณเชื่อมต่อเช่น:

import mysql.connector    
cnx = mysql.connector.connect(user='scott', password='tiger',
                              host='127.0.0.1',
                              database='employees')

try:
   cursor = cnx.cursor()
   cursor.execute("""
      select 3 from your_table
   """)
   result = cursor.fetchall()
   print result
finally:
    cnx.close()

2
ไม่ง่ายอย่างที่คุณเรียกร้อง เมื่อฉันพยายามที่จะติดตั้งรอบต่อนาทีฉันได้รับสองประเด็นของการพึ่งพา (FileDigests และ PayloadIsXz) จาก RPM ของฉัน: rpm -i mysql-connector-python-1.1.5-1.el6.noarch.rpm error: Failed dependencies: rpmlib(FileDigests) <= 4.6.0-1 is needed by mysql-connector-python-1.1.5-1.el6.noarch rpmlib(PayloadIsXz) <= 5.2-1 is needed by mysql-connector-python-1.1.5-1.el6.noarch
tatlar

2
ฉันเคยชอบห้องสมุดนี้ แต่ไม่รองรับ PyPi อย่างเป็นทางการอีกต่อไป ฉันย้ายมาอยู่ที่ MySQLdb แล้ว
Steven Mercatante

2
@Arms: ไม่รองรับ PyPi อย่างเป็นทางการอีกต่อไปแล้วใช่ไหม คุณมีแหล่งที่มาสำหรับสิ่งนี้หรือไม่?
Messa

7
pip install mysql-connector-pythonยังจะทำงาน ฉันไม่เห็นว่าจะบอกว่าไม่รองรับ PyPi อีกต่อไปหรือไม่ ดีมากถ้าคุณไม่มีสิทธิ์เข้าถึงคอมไพเลอร์ gcc / C บนระบบของคุณและไม่สามารถติดตั้งmysqldbได้
decvalts

7
ตั้งแต่วันที่ 7 พ.ย. 2559 แพ็คเกจสำหรับ pip เป็นเพียงตัวเชื่อมต่อ mysql pip search mysql-connectorเพื่อค้นหาชื่อแพ็คเกจ คำตอบจากที่นี่: stackoverflow.com/a/22829966/2048266
Nommer

117

หยุดใช้ MySQLDb หากคุณต้องการหลีกเลี่ยงการติดตั้งส่วนหัว mysql เพื่อเข้าถึง mysql จาก python

ใช้pymysql มันไม่ทั้งหมดของสิ่งที่ MySQLdb ไม่ แต่มันถูกนำมาใช้อย่างหมดจดในหลามกับNO ภายนอกอ้างอิง ทำให้กระบวนการติดตั้งในระบบปฏิบัติการทั้งหมดสอดคล้องกันและใช้งานง่าย pymysqlเป็นการลดลงของการแทนที่สำหรับ MySQLDb และ IMHO ไม่มีเหตุผลใดที่จะใช้ MySQLDb เพื่ออะไร ... เคยมีมา! - PTSD from installing MySQLDb on Mac OSX and *Nix systemsแต่นั่นเป็นเพียงฉัน

การติดตั้ง

pip install pymysql

แค่นั้นแหละ ... คุณพร้อมที่จะเล่น

ตัวอย่างการใช้งานจาก pymysql Github repo

import pymysql.cursors
import pymysql

# Connect to the database
connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             db='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('webmaster@python.org', 'very-secret'))

    # connection is not autocommit by default. So you must commit to save
    # your changes.
    connection.commit()

    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
        cursor.execute(sql, ('webmaster@python.org',))
        result = cursor.fetchone()
        print(result)
finally:
    connection.close()

นอกจากนี้ - แทนที่ MySQLdb ในรหัสที่มีอยู่อย่างรวดเร็วและโปร่งใส

หากคุณมีรหัสที่มีอยู่ซึ่งใช้ MySQLdb คุณสามารถแทนที่ด้วย pymysql ได้โดยใช้กระบวนการง่ายๆนี้:

# import MySQLdb << Remove this line and replace with:
import pymysql
pymysql.install_as_MySQLdb()

การอ้างอิงที่ตามมาทั้งหมดกับ MySQLdb จะใช้ pymysql อย่างโปร่งใส


3
"เสมอ" แข็งแกร่งเล็กน้อย ... เกิดอะไรขึ้นกับ peewee หรือ sqlalchemy แม้ว่าพวกเขาจะอยู่ในรูปแบบไลบรารี ORM พวกเขาก็ยังมีประโยชน์เหมือนกัน
OneCricketeer

4
ไม่ฉันไม่คิดว่ามันแข็งแกร่งเลย ให้ตัวเลือกในการใช้ MySQLDb หรือ PyMysql ฉันคิดว่าการเลือก PyMysql นั้นไม่ใช่เรื่องง่ายเพราะเป็นการติดตั้งจุดเล็ก ๆ ที่ไม่มีการพึ่งพาขณะที่ MySQLDb ต้องการไฟล์ส่วนหัวสำหรับการพัฒนา mysql เพื่อให้ติดตั้งแพลตฟอร์มระบบปฏิบัติการของคุณ sqlalchemy ไม่ปัจจัยที่เป็นแบบนี้เพราะมันยังคงต้องห่อรอบโมดูลที่สามารถพูดคุยกับ MySQL เช่น PyMysql, MySQLdb, CyMySQL ฯลฯ แคระมีลักษณะที่น่าสนใจแม้ว่าฉันจะตรวจสอบว่า
OkezieE

2
@ cricket_007 peewee และ sqlalchemly ไม่ได้ใช้ตัวเชื่อมต่อ db ของตัวเองพวกมันมีเลเยอร์เหนือ MySQLdb เป็นต้น
rocksportrocker

25

ลองใช้MySQLdb MySQLdb รองรับ Python 2 เท่านั้น

มีหน้าวิธีการที่นี่: http://www.kitebird.com/articles/pydbapi.html


จากหน้า:

# server_version.py - retrieve and display database server version

import MySQLdb

conn = MySQLdb.connect (host = "localhost",
                        user = "testuser",
                        passwd = "testpass",
                        db = "test")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()

2
ระวัง - โมดูลนี้ไม่มีการสนับสนุนเขตเวลาในการเชื่อมต่อ
kommradHomer

1
@kommradHomer คุณช่วยอธิบายเพิ่มเติมได้ไหม?
Pyderman

1
@kommradHomer - เขตเวลาสนับสนุนอะไรกับคุณ (หรืออื่น ๆ - โดยเฉพาะเมื่อเชื่อมต่อlocalhost)
warren

1
@warren ไม่ฉันไม่ได้เชื่อมต่อ localhost ในกรณีของฉัน
kommradHomer

1
ฉันจะตรวจสอบว่าติดตั้งไลบรารีใดเพื่อเชื่อมต่อกับฐานข้อมูลได้อย่างไร
posfan12

18

ในฐานะที่เป็นคนขับ DB ยังมีoursql บางส่วนของเหตุผลที่ระบุไว้ในลิงค์นั้นซึ่งบอกว่าทำไมตารางของเราดีกว่า

  • oursql มีพารามิเตอร์จริงส่ง SQL และข้อมูลไปยัง MySQL แยกจากกันโดยสิ้นเชิง
  • oursql อนุญาตให้สตรีมข้อความหรือข้อมูลไบนารีลงในฐานข้อมูลและสตรีมออกจากฐานข้อมูลแทนที่จะกำหนดให้ทุกอย่างต้องถูกบัฟเฟอร์ในไคลเอนต์
  • sql ของเราสามารถแทรกแถวอย่างเกียจคร้านและดึงแถวได้อย่างเกียจคร้าน
  • oursql มีการสนับสนุน Unicode เป็นค่าเริ่มต้น
  • sql ของเรารองรับ python 2.4 ถึง 2.7 โดยไม่มีคำเตือนเรื่องการคัดค้านใน 2.6+ (ดู PEP 218) และโดยไม่ล้มเหลวใน 2.7 (ดู PEP 328)
  • sql ของเราทำงานโดยกำเนิดบน python 3.x

ดังนั้นวิธีการเชื่อมต่อกับ mysql กับเราได้อย่างไร

คล้ายกับ mysqldb มาก:

import oursql

db_connection = oursql.connect(host='127.0.0.1',user='foo',passwd='foobar',db='db_name')
cur=db_connection.cursor()
cur.execute("SELECT * FROM `tbl_name`")
for row in cur.fetchall():
    print row[0]

การสอนในเอกสารประกอบนั้นค่อนข้างดี

และแน่นอนว่า ORM SQLAlchemy เป็นตัวเลือกที่ดีดังที่ได้กล่าวไปแล้วในคำตอบอื่น ๆ


4
ฉันไม่เข้าใจ 'การทำงานแบบปกติบน python 3.x' ฉันเพิ่งลองติดตั้งแล้วและ setup.py ก็ระเบิดออกมาเพราะมันไม่ได้ใช้การเรียกพิมพ์ที่เข้ากันได้กับ Python 3 ฟังดูดีจนกระทั่งฉันได้ลองจริงๆ
otakucode

15

เรียกใช้คำสั่งนี้ในเทอร์มินัลของคุณเพื่อติดตั้งตัวเชื่อมต่อ mysql:

pip install mysql-connector-python

และรันสิ่งนี้ในเครื่องมือแก้ไข python ของคุณเพื่อเชื่อมต่อกับ MySQL:

import mysql.connector

mydb = mysql.connector.connect(
      host="localhost",
      user="yusername",
      passwd="password",
      database="database_name"
)

ตัวอย่างในการรันคำสั่ง MySQL (ใน python edior ของคุณ):

mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE customers (name VARCHAR(255), address VARCHAR(255))")    
mycursor.execute("SHOW TABLES")

mycursor.execute("INSERT INTO customers (name, address) VALUES ('John', 'Highway 21')")    
mydb.commit() # Use this command after insert or update

สำหรับคำสั่งเพิ่มเติม: https://www.w3schools.com/python/python_mysql_getstarted.asp


คุณช่วยตอบคำถามนี้ได้ไหม? มันเกี่ยวข้องกับmysql-connectorเท่านั้น stackoverflow.com/questions/59405740/…

1
ผู้ชายบางคนตอบคำถามของคุณที่นั่นแล้ว คุณลืมรันmydb.commit()หลังจากใส่ค่าลงในตาราง
Sherzod

13

sqlalchemy


SQLAlchemy เป็นชุดเครื่องมือ Python SQL และ Object Relational Mapper ที่ช่วยให้นักพัฒนาแอพพลิเคชั่นมีพลังและความยืดหยุ่นอย่างเต็มที่ของ SQL SQLAlchemy ให้ชุดเต็มของรูปแบบการคงอยู่ในระดับองค์กรที่รู้จักกันดีออกแบบมาสำหรับการเข้าถึงฐานข้อมูลที่มีประสิทธิภาพและมีประสิทธิภาพสูงปรับให้เข้ากับภาษาโดเมนที่เรียบง่ายและ Pythonic

การติดตั้ง

pip install sqlalchemy

แบบสอบถาม RAW

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

engine = create_engine("mysql://<user_name>:<password>@<host_name>/<db_name>")
session_obj = sessionmaker(bind=engine)
session = scoped_session(session_obj)

# insert into database
session.execute("insert into person values(2, 'random_name')")
session.flush()
session.commit()

วิธีการออม

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session

Base = declarative_base()
engine = create_engine("mysql://<user_name>:<password>@<host_name>/<db_name>")
session_obj = sessionmaker(bind=engine)
session = scoped_session(session_obj)

# Bind the engine to the metadata of the Base class so that the
# declaratives can be accessed through a DBSession instance
Base.metadata.bind = engine

class Person(Base):
    __tablename__ = 'person'
    # Here we define columns for the table person
    # Notice that each column is also a normal Python instance attribute.
    id = Column(Integer, primary_key=True)
    name = Column(String(250), nullable=False)

# insert into database
person_obj = Person(id=12, name="name")
session.add(person_obj)
session.flush()
session.commit()

11

แม้จะมีคำตอบทั้งหมดข้างต้น แต่ในกรณีที่คุณไม่ต้องการเชื่อมต่อกับฐานข้อมูลเฉพาะล่วงหน้าตัวอย่างเช่นหากคุณต้องการสร้างฐานข้อมูลยังคง (!) คุณสามารถใช้connection.select_db(database)ดังที่แสดงในตัวอย่างต่อไปนี้

import pymysql.cursors
connection = pymysql.connect(host='localhost',
                         user='mahdi',
                         password='mahdi',
                         charset='utf8mb4',
                         cursorclass=pymysql.cursors.DictCursor)
cursor = connection.cursor()
cursor.execute("CREATE DATABASE IF NOT EXISTS "+database)
connection.select_db(database)
sql_create = "CREATE TABLE IF NOT EXISTS "+tablename+(timestamp DATETIME NOT NULL PRIMARY KEY)"
cursor.execute(sql_create)
connection.commit()
cursor.close()

8

MySQLdbเป็นวิธีที่ตรงไปตรงมา คุณได้รับการดำเนินการแบบสอบถาม SQL ผ่านการเชื่อมต่อ ระยะเวลา

วิธีที่ฉันชอบซึ่งเป็น pythonic คือการใช้SQLAlchemyอันยิ่งใหญ่แทน นี่คือการสอนที่เกี่ยวข้องกับแบบสอบถามและนี่คือการสอนเกี่ยวกับความสามารถ ORMของ SQLALchemy


1
ลิงก์นั้นตายไปแล้วคุณช่วยตรวจดูและอัพเดตมันด้วยลิงค์ที่ถูกต้องได้ไหม?
Naveen Vijay

6

สำหรับ Python3.6 ฉันพบไดร์เวอร์สองตัว: pymysql และ mysqlclient ฉันทดสอบประสิทธิภาพระหว่างพวกเขาและได้ผลลัพธ์: mysqlclient เร็วขึ้น

ด้านล่างนี้เป็นขั้นตอนการทดสอบของฉัน (ต้องติดตั้งโปรไฟล์หลาม lib หลามเพื่อวิเคราะห์เวลาผ่านไป:

sql ดิบ: select * from FOO;

ดำเนินการทันทีใน terminal mysql: 46410 rows in set (0.10 sec)

pymysql (2.4s):

from profilehooks import profile
import pymysql.cursors
import pymysql
connection = pymysql.connect(host='localhost', user='root', db='foo')
c = connection.cursor()

@profile(immediate=True)
def read_by_pymysql():
    c.execute("select * from FOO;")
    res = c.fetchall()

read_by_pymysql()

นี่คือโปรไฟล์ pymysql: ป้อนคำอธิบายรูปภาพที่นี่


mysqlclient (0.4s)

from profilehooks import profile
import MySQLdb

connection = MySQLdb.connect(host='localhost', user='root', db='foo')
c = connection.cursor()

@profile(immediate=True)
def read_by_mysqlclient():
    c.execute("select * from FOO;")
    res = c.fetchall()

read_by_mysqlclient()

นี่คือโปรไฟล์ mysqlclient: ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นดูเหมือนว่า mysqlclient เร็วกว่า pymysql มาก


6

แม้ว่าบางท่านอาจทำเครื่องหมายว่าซ้ำกันและได้รับการไม่พอใจที่ผมคัดลอกของคนอื่นคำตอบผมจะจริงๆต้องการจะเน้นด้านของการตอบสนองนาย Napik ฯ เพราะฉันพลาดสิ่งนี้ทำให้เว็บไซต์ทั่วประเทศหยุดทำงาน (9 นาที) หากมีใครบางคนเปิดเผยข้อมูลนี้ฉันสามารถป้องกันได้!

นี่คือรหัสของเขา:

import mysql.connector    
cnx = mysql.connector.connect(user='scott', password='tiger',
                              host='127.0.0.1',
                              database='employees')
try:
   cursor = cnx.cursor()
   cursor.execute("""select 3 from your_table""")
   result = cursor.fetchall()
   print(result)
finally:
    cnx.close()

สิ่งสำคัญที่นี่คือมาตราลองและในที่สุด การทำเช่นนี้ช่วยให้การเชื่อมต่อกับALWAYSถูกปิดโดยไม่คำนึงถึงสิ่งที่เกิดขึ้นในส่วนของเคอร์เซอร์ / sqlstatement ของรหัส การเชื่อมต่อที่ใช้งานอยู่จำนวนมากทำให้ DBLoadNoCPU ขัดขวางและอาจทำให้เซิร์ฟเวอร์ db ล้มเหลว

ฉันหวังว่าคำเตือนนี้จะช่วยให้เซิร์ฟเวอร์และงานในท้ายที่สุด! : D


6

วิธีที่ดีที่สุดในการเชื่อมต่อกับ MySQL จาก python คือใช้ MySQL Connector / Python เพราะเป็นไดร์เวอร์ Oracle อย่างเป็นทางการสำหรับ MySQL สำหรับทำงานกับ Python และทำงานได้กับทั้ง Python 3 และ Python 2

ทำตามขั้นตอนด้านล่างเพื่อเชื่อมต่อกับ MySQL

  1. ติดตั้งตัวเชื่อมต่อโดยใช้ pip

    pip install mysql-connector-python

หรือคุณสามารถดาวน์โหลดตัวติดตั้งได้จากhttps://dev.mysql.com/downloads/connector/python/

  1. ใช้connect()วิธีการของตัวเชื่อมต่อ mysql python เพื่อเชื่อมต่อกับ MySQL.pass อาร์กิวเมนต์ที่ต้องการกับconnect()วิธีการ เช่นชื่อโฮสต์ชื่อผู้ใช้รหัสผ่านและชื่อฐานข้อมูล

  2. สร้างcursorวัตถุจากวัตถุเชื่อมต่อส่งคืนโดยconnect()วิธีการดำเนินการแบบสอบถาม SQL

  3. ปิดการเชื่อมต่อหลังจากงานเสร็จสมบูรณ์

ตัวอย่าง :

import mysql.connector
 from mysql.connector import Error
 try:
     conn = mysql.connector.connect(host='hostname',
                         database='db',
                         user='root',
                         password='passcode')
     if conn.is_connected():
       cursor = conn.cursor()
       cursor.execute("select database();")
       record = cursor.fetchall()
       print ("You're connected to - ", record)
 except Error as e :
    print ("Print your error msg", e)
 finally:
    #closing database connection.
    if(conn.is_connected()):
       cursor.close()
       conn.close()

การอ้างอิง - https://pynative.com/python-mysql-database-connection/

API ที่สำคัญของ MySQL Connector Python

  • สำหรับการดำเนินการ DML - ใช้cursor.execute()และcursor.executemany()เรียกใช้แบบสอบถาม และหลังจากการใช้นี้connection.commit()เพื่อยืนยันการเปลี่ยนแปลงของคุณในฐานข้อมูล

  • ดึงข้อมูล - ใช้cursor.execute()ในการเรียกใช้แบบสอบถามและcursor.fetchall(), cursor.fetchone(), cursor.fetchmany(SIZE)ดึงข้อมูล


คุณ * เชื่อมต่อกับ ...
John Forbes

5

เพียงแก้ไขในคำตอบข้างต้น เพียงรันคำสั่งนี้เพื่อติดตั้ง mysql สำหรับ python

sudo yum install MySQL-python
sudo apt-get install MySQL-python

จำ! มันเป็นกรณีที่สำคัญ


ฉันติดตั้ง MySQL-python ผ่าน yum install การติดตั้งเสร็จสมบูรณ์ แต่ฉันไม่สามารถนำเข้าโมดูล MySQLdb มันบอกว่าไม่มีโมดูลดังกล่าว ทำไมมันถึงเป็นเช่นนั้น?
3527975

ยังไม่ชัดเจนว่าคำตอบใดที่คุณหมายถึงเมื่อคุณพูดว่า "คำตอบด้านบน" กรุณาทำให้คำตอบของคุณเสร็จสมบูรณ์ในตัวเอง หากคุณต้องการอ้างอิงคำตอบอื่น ๆ โปรดลิงก์ไปยังคำตอบเฉพาะ
Flimm

5

mysqlclient นั้นดีที่สุดเพราะคนอื่น ๆ ให้การสนับสนุนกับไพ ธ อนเฉพาะรุ่นเท่านั้น

 pip install mysqlclient

รหัสตัวอย่าง

    import mysql.connector
    import _mysql
    db=_mysql.connect("127.0.0.1","root","umer","sys")
    #db=_mysql.connect(host,user,password,db)
    # Example of how to insert new values:
    db.query("""INSERT INTO table1 VALUES ('01', 'myname')""")
    db.store_result()
    db.query("SELECT * FROM new1.table1 ;") 
    #new1 is scheme table1 is table mysql 
    res= db.store_result()
    for i in range(res.num_rows()):
        print(result.fetch_row())

ดูhttps://github.com/PyMySQL/mysqlclient-python


+1 สำหรับการเสนอทางออกที่เร็วที่สุดสำหรับ python 3 อย่างไรก็ตามmysql.connectorและ_mysqlให้ทั้งข้อผิดพลาดในการนำเข้า (แม้ว่าตัวเลือกที่สองควรทำงานตามเอกสารประกอบ) import MySQLdbทำงานได้แล้วMySQLdb.connect...
Suzana

3

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

นี่คือตัวอย่างง่ายๆ:

from storm.locals import *

# User will be the mapped object; you have to create the table before mapping it
class User(object):
        __storm_table__ = "user" # table name
        ID = Int(primary=True) #field ID
        name= Unicode() # field name

database = create_database("mysql://root:password@localhost:3306/databaseName")
store = Store(database)

user = User()
user.name = u"Mark"

print str(user.ID) # None

store.add(user)  
store.flush() # ID is AUTO_INCREMENT

print str(user.ID) # 1 (ID)

store.commit() # commit all changes to the database

วิธีค้นหาและใช้วัตถุ:

michael = store.find(User, User.name == u"Michael").one()
print str(user.ID) # 10

ค้นหาด้วยคีย์หลัก:

print store.get(User, 1).name #Mark

สำหรับข้อมูลเพิ่มเติมโปรดดูที่การกวดวิชา


2

นี่คือการเชื่อมต่อฐานข้อมูล Mysql

from flask import Flask, render_template, request
from flask_mysqldb import MySQL

app = Flask(__name__)


app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'root'
app.config['MYSQL_DB'] = 'MyDB'

mysql = MySQL(app)


@app.route('/', methods=['GET', 'POST']) 
def index():
    if request.method == "POST":
        details = request.form
        cur = mysql.connection.cursor()
        cur.execute ("_Your query_")
        mysql.connection.commit()
        cur.close()
        return 'success'
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

1

ก่อนติดตั้งไดรเวอร์

pip install MySQL-python   

จากนั้นโค้ดพื้นฐานจะเป็นดังนี้:

#!/usr/bin/python
import MySQLdb

try:
    db = MySQLdb.connect(host="localhost",      # db server, can be a remote one 
                     db="mydb"                  # database
                     user="mydb",               # username
                     passwd="mydb123",          # password for this username
                     )        

    # Create a Cursor object
    cur = db.cursor()

    # Create a query string. It can contain variables
    query_string = "SELECT * FROM MY_TABLE"

    # Execute the query
    cur.execute(query_string)

    # Get all the rows present the database
    for each_row in cur.fetchall():
        print each_row

    # Close the connection
    db.close()
except Exception, e:
    print 'Error ', e 

1

คุณสามารถเชื่อมต่อรหัสไพ ธ อนกับ mysql ได้ด้วยวิธีนี้

import MySQLdb
db = MySQLdb.connect(host="localhost",
                 user="appuser",
                 passwd="",
                 db="onco")

cursor = db.cursor()

1

ก่อนติดตั้งไดรเวอร์ (Ubuntu)

  • sudo apt-get install python-pip

  • sudo pip install -u pip

  • sudo apt-get install python-dev libmysqlclient-dev

  • sudo apt-get install MySQL-python

รหัสการเชื่อมต่อฐานข้อมูล MySQL

import MySQLdb
conn = MySQLdb.connect (host = "localhost",user = "root",passwd = "pass",db = "dbname")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()

0

สำหรับ python 3.3

CyMySQL https://github.com/nakagami/CyMySQL

ฉันมี pip ติดตั้งอยู่บน windows 7 ของฉันเพียงแค่ติดตั้ง pip cymysql

(คุณไม่ต้องการ cython) รวดเร็วและไม่เจ็บปวด


3
คุณสามารถสร้างคำถามใหม่เกี่ยวกับ SO และแสดงความคิดเห็นพร้อมลิงค์ไปที่นี่
Lazik

-1

ก่อนอื่นให้ติดตั้งตัวเชื่อมต่อ python-mysql จากhttps://dev.mysql.com/downloads/connector/python/

บนคอนโซล Python ให้ป้อน:

pip install mysql-connector-python-rf
import mysql.connector

1
คำถามกว้างเกินไปเล็กน้อย แต่คำตอบนี้ดูเหมือนจะแคบไปหน่อย (อย่างน้อยก็ในแง่ที่ว่าการติดตั้งและนำเข้าโมดูลเพียงอย่างเดียวไม่สามารถทำได้) ดูเหมือนว่าจะมีเชลล์และไพ ธ อนผสมอยู่ในบล็อกโค้ดเดียวโดยไม่มีคำอธิบายหรือคำแนะนำใด ๆ ว่าเกิดอะไรขึ้นและทำอะไร
Ondrej K.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.