题 如何使用Python连接MySQL数据库?


如何使用python程序连接到MySQL数据库?


971
2017-12-16 21:49


起源


这里的大多数答案都集中在安装MySQLdb库,我真的建议选择MySQL / Oracle提供的MySQL Connector / Python,这使得这个过程更加简单: stackoverflow.com/questions/372885/... - Mr. Napik
使用Oracle的Connector / Python的问题在于它存在细微的错误和其他集成问题。它很容易安装,但几乎不可能为我尝试过的所有真实用例工作。因此,为什么我总是推荐MySQLdb。 - Joe C.
@ Mr.Napik我正在使用 pymysql 因为它是纯粹的免费Python 这种比较。 - Cees Timmerman


答案:


使用Python以3个步骤连接到MYSQL

1 - 设置

您必须在执行任何操作之前安装MySQL驱动程序。与PHP不同,默认情况下只使用Python安装SQLite驱动程序。最常用的包是这样做的 MySQLdb的 但是使用easy_install很难安装它。

对于Windows用户,您可以获得 MySQLdb的exe

对于Linux,这是一个休闲包(python-mysqldb)。 (您可以使用 sudo apt-get install python-mysqldb (对于基于debian的发行版), yum install MySQL-python (对于基于rpm),或 dnf install python-mysql (用于现代fedora发行版)在命令行中下载。)

对于Mac,你可以 使用Macport安装MySQLdb

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对象。 Python社区中最着名的ORM是 SQLAlchemy的

我强烈建议你使用它:你的生活将变得更加容易。

我最近发现了Python世界中的另一颗宝石: peewee。这是一个非常精简的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) 是必须的。


1128
2017-12-16 21:51



很高兴你喜欢小便!!我已经添加了对MySQL以及一些的支持 文件 与它整合。快乐的黑客! - coleifer
请注意,在撰写本文时,MySQLdb不支持Python 3. sourceforge页面显示“即将推出Python 3支持”,但自2012-10-08以来尚未更新。对于Python 3,有 PyMySQL 和 oursql。 - paul
另请注意以下内容: pip install MySQL-python - Corvusoft
对于非标准端口上的外部服务器的示例连接,此答案将更有帮助,以显示如何执行此操作。说localhost是通常的方法,这是无稽之谈。 - Anthony
Peewee已更改默认行为,并且不再使用默认自动提交。甚至数据库驱动程序的情况现在已经改变这个问题需要更新,但由于对我的一些答案滥用编辑,我不再编辑它们了。 - e-satis


这是一种方法:

#!/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()

参考这里


159
2018-05-28 15:39



您是否需要在此示例中提交,因为您没有修改数据库? - sumanth232
请注意 - 此模块在连接时没有时区支持 - kommradHomer
它不适用于我的共享主机。这么说 No module named MySQLdb。如何在共享主机上使用mysql和python。还有其他选择 - Bhavesh Gangani
@BhaveshGangani您需要联系您的主机并询问他们支持的Python库的原因。如果它们支持pypi,那么您可以在部署发生时始终加载包。 - George Stocker♦
不要忘记关闭“db”对象[db.close()],否则可能会遇到一些问题,例如,当您的Web应用程序在其生命周期中必须执行许多连接时。我是一个“困”连接可能导致应用程序出现问题的活生生的证明,另一件事:增加数据库超时可能是一个解决方案,但保持终身超时并不是一个好习惯。 - ivanleoncz


Oracle(MySQL)现在支持纯Python连接器。这意味着不需要安装二进制文件:它只是一个Python库。它被称为“连接器/ Python”。

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


105
2018-01-06 21:32



这比使用mysqldb更快吗? - alwbtc
是的。此外,它比MySQLdb更麻烦,我认为API更好。这应该是答案。 - Anthony
使用python的官方mysql连接器是赢得时间的最佳方式 - Anas
@ J0hnG4lt您只需点击登录表单下方的“不,谢谢,只需开始下载”(实际上似乎是强制性的,但不是)。 - ComFreek
@ComFreek很棒。那怎么样更好?我们可以停止应用“Windows工作流程”吗?包管理存在。 - J0hnG4lt


如果你不需要MySQLdb,但是会接受任何库,我会非常非常推荐MySQL的MySQL Connector / Python: http://dev.mysql.com/downloads/connector/python/

它是一个包(大约110k),纯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()

95
2017-12-29 02:52



不像你声称的那么简单。当我尝试安装rpm时,我从RPM获得了一些依赖性问题(FileDigests和PayloadIsXz): 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
我以前更喜欢这个库,但PyPi不再正式支持它。我已经搬到了MySQLdb。 - Steven Mercatante
@Arms:PyPi上不再正式支持?你有这方面的资料吗? - Messa
pip install mysql-connector-python 也会工作。我不知道它在PyPi上不再支持的地方了吗?如果您无法访问系统上的gcc / C编译器,那就太棒了,因此无法安装 mysqldb。 - decvalts
截至2016年11月7日,pip包只是mysql-connector, pip search mysql-connector 找到包名称。从这里回答: stackoverflow.com/a/22829966/2048266 - nommer


如果你想避免安装mysql头只是为了从python访问mysql,请停止使用MySQLDb。

使用 pymysql。它完成了MySQLDb的所有功能,但它完全是用Python实现的 没有外部依赖。这使得所有操作系统上的安装过程一致且容易。 pymysql 是MySQLDb和恕我直言的替代品,没有理由将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。


85
2017-10-15 21:25



“总是”有点强烈...... peewee或sqlalchemy有什么问题?即使它们确实作为ORM库存在,它们仍然同样有用 - cricket_007
不,我认为它根本不强。考虑到使用MySQLDb或PyMysql的选项,我认为选择PyMysql是没有道理的,因为它是一个没有依赖关系的简单pip安装,而MySQLDb需要为你的OS平台安装mysql开发头文件才能工作。 Sqlalchemy没有考虑到这一点,因为它仍然需要包装一个可以与mysql交谈的模块,如PyMysql,MySQLDb,CyMySQL e.t.c.虽然Peewee看起来很有趣,但我会检查出来 - OkezieE
@ cricket_007 peewee和sqlalchemly没有实现自己的db连接器,它们在MySQLdb等上面提供了一个层。 - rocksportrocker
非常简单的python 3.6解决方案....谢谢...... - Tajdar Khan Afridi


作为db驱动程序,也有 oursql。在该链接上列出的一些原因,说明为什么我们的更好:

  • oursql具有真正的参数化,完全将SQL和数据完全发送到MySQL。
  • oursql允许将文本或二进制数据流式传输到数据库并从数据库流出,而不是要求在客户端中缓存所有内容。
  • oursql可以懒惰地插入行并且懒惰地获取行。
  • oursql默认支持unicode。
  • oursql支持python 2.4到2.7,在2.6+上没有任何弃用警告(参见PEP 218),并且2.7没有完全失败(参见PEP 328)。
  • oursql在python 3.x上本机运行。

那么如何使用oursql连接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是一个不错的选择,正如其他答案中已经提到的那样。


18
2017-12-16 21:52



我不明白'在python 3.x上本地运行'。我只是尝试安装它和setup.py炸弹,因为它甚至不使用Python 3兼容的打印调用。听起来很棒,直到我真的尝试过。 - otakucode


尝试使用MySQLdb

这里有一个页面: 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 ()

17
2018-06-22 14:18



请注意 - 此模块在连接时没有时区支持 - kommradHomer
@kommradHomer你能详细说明吗? - Pyderman
@kommradHomer - 时区支持对你(或其他人)有什么影响 - 特别是在连接时 localhost)? - warren
@warren不,我没有在我的情况下连接localhost - kommradHomer
如何检测安装哪个库以连接到数据库? - posfan12


尽管有上述所有答案,但如果您不想提前连接到特定数据库,例如,如果您想要创建数据库仍然(!),您可以使用 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()

11
2017-12-16 22:29