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


1162

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


44
:这里大多数的答案集中在安装MySQLdb的图书馆,我真的建议选择了MySQL的连接器/ Python的提供由MySQL / Oracle的,这使得过程变得更为简单stackoverflow.com/questions/372885/...
Napik先生

8
使用Oracle的Connector / Python的问题在于它具有细微的错误和其他集成问题。它很容易安装,但是几乎无法在我尝试过的所有实际用例中使用。因此,为什么我总是推荐MySQLdb。
Joe C.

7
我正在使用@ Mr.Napik,pymysql因为根据此比较,它是纯免费的Python 。
Cees Timmerman

Answers:


1245

分三步使用Python 2连接到MYSQL

1-设定

在执行任何操作之前,必须安装MySQL驱动程序。与PHP不同,默认情况下,Python仅安装SQLite驱动程序。最常用的软件包是MySQLdb,但很难使用easy_install进行安装。请注意,MySQLdb仅支持Python 2。

对于Windows用户,您可以获取MySQLdbexe

对于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)外,没有其他要求。


46
很高兴您喜欢peewee!我添加了对MySQL的支持以及有关与MySQL 集成的一些文档。骇客入侵!
coleifer

14
请注意,在撰写本文时,MySQLdb不支持Python3。sourceforge页面显示“ Python 3支持即将推出”,但自2012年10月8日以来未进行任何更新。对于Python 3,有PyMySQLoursql
保罗

8
另外请注意以下事项:pip install MySQL-python
Ben Crowhurst 2013年

5
通过在非标准端口上连接到外部服务器的示例连接,以显示如何执行此操作,将更有用。说本地主机是通常的做法,这是胡说八道。
安东尼

3
Peewee更改了默认行为,并且默认情况下不再使用自动提交。现在甚至DB驱动程序的情况也已改变。该问题需要更新,但是由于滥用了部分答案,因此不再编辑。
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 2015年

它在我的共享主机上不起作用。这样说No module named MySQLdb。如何在共享主机上将mysql与python一起使用。还有其他选择吗?
Bhavesh Gangani 2015年

@BhaveshGangani,您需要联系您的主机,并询问他们为什么支持Python库。如果他们支持pypi,那么您总是可以在部署时加载程序包。
乔治·斯托克2015年

1
有趣的是,尽管文档说这仅适用于python 2,但对我来说似乎确实适用于python 3
lucidbrot19年

122

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

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


1
这比使用mysqldb快吗?
alwbtc

8
是的。而且,它比MySQLdb麻烦,而且API更好。这应该是答案。
安东尼

1
使用python的官方mysql连接器是赢得时间的最佳方法
Anas 2014年

2
@ J0hnG4lt您可以单击登录表单下方的“不,谢谢,只需开始下载”(实际上似乎是强制性的,但不是强制性的)。
ComFreek

6
@ComFreek太好了。怎么样了?我们可以停止应用“ Windows工作流”吗?包管理存在。
J0hnG4lt 2015年

119

如果您不需要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()

2
并不像您声称的那么简单。当我尝试安装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 2014年

2
我曾经更喜欢这个库,但是PyPi不再正式支持它。从那以后,我搬到了MySQLdb。
Steven Mercatante 2014年

2
@Arms:PyPi不再受正式支持?您有任何资料来源吗?
Messa 2015年

7
pip install mysql-connector-python也可以。我看不到PyPi不再支持的地方吗?如果您无法访问系统上的gcc / C编译器,因此无法安装,那就太好了mysqldb
decvalts

7
截至2016年11月7日,pip的软件包仅为mysql-connector,pip search mysql-connector以查找软件包名称。从这里回答:stackoverflow.com/a/22829966/2048266
nommer

117

如果要避免安装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仓库的示例用法

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
库存

4
不,我不认为这很强大。给定可以使用MySQLDb或PyMysql的选项,我认为选择PyMysql毫无用处,因为它是一个简单的无依赖项的pip安装,而MySQLDb需要安装mysql开发头文件才能在您的OS平台上运行。Sqlalchemy没有考虑到这一点,因为它仍然需要包装一个可以与mysql对话的模块,例如PyMysql,MySQLDb,CyMySQL等Peewee看起来很有趣,我会检查一下
OkezieE

2
@ cricket_007 peewee和sqlalchemly不实现他们自己的分贝连接器,它们提供上述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 2015年

1
@kommradHomer请详细说明一下吗?
Pyderman '16

1
@kommradHomer-时区支持对您(或其他人-尤其是在连接时localhost)有什么影响?
沃伦

1
@warren不,在我的情况下,我没有连接本地主机
kommradHomer 2016年

1
如何检测安装了哪个库以连接数据库?
posfan12

18

作为数据库驱动程序,还有oursql。该链接上列出的一些原因说明了为什么我们的sql更好:

  • 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是一个不错的选择,正如其他答案中已经提到的那样。


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-connectorstackoverflow.com/questions/59405740/…–

1
有些人已经在那里回答了您的问题。您只是mydb.commit()在向表中插入值后忘了运行
Sherzod '19

13

SqlAlchemy的


SQLAlchemy是Python SQL工具箱和对象关系映射器,它为应用程序开发人员提供了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()

ORM方式

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()


6

对于Python3.6,我发现了两个驱动程序:pymysql和mysqlclient。我测试了它们之间的性能并得到了结果:mysqlclient更快。

以下是我的测试过程(需要安装python lib profilehooks来分析时间流逝:

原始SQL: select * from FOO;

在mysql终端中立即执行: 46410 rows in set (0.10 sec)

pymysql(2.4秒):

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.4秒)

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

从python连接到MySQL的最佳方法是使用MySQL Connector / Python,因为它是MySQL的正式Oracle驱动程序,可与Python一起使用,并且可与Python 3和Python 2一起使用。

按照下面提到的步骤连接MySQL

  1. 使用pip安装连接器

    pip install mysql-connector-python

或者您可以从https://dev.mysql.com/downloads/connector/python/下载安装程序

  1. 使用connect()mysql连接器python的method连接到MySQL。将所需的参数传递给connect()method。即主机,用户名,密码和数据库名称。

  2. cursorconnect()方法返回的连接对象创建对象以执行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/

MySQL Connector Python的重要API

  • 对于DML操作-使用cursor.execute()cursor.executemany()运行查询。并connection.commit()用于保留对数据库的更改之后

  • 要获取数据-使用cursor.execute()运行查询cursor.fetchall()cursor.fetchone()cursor.fetchmany(SIZE)获取数据


您已与...连接
约翰·福布斯

5

只是以上答案的修改。只需运行此命令即可为python安装mysql

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

记得!区分大小写。


我通过yum install安装了MySQL-python。安装已完成,但无法导入MySQLdb模块。它说没有这样的模块。知道为什么会这样吗?
user3527975

当您说“以上答案”时,您是指哪个答案还不清楚。请回答完整。如果要参考其他答案,请链接到特定答案。
Flimm

5

mysqlclient是最好的,因为其他人仅提供对特定版本的python的支持

 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

5

尽管有些人可能标志着其视为重复和生气,我复制别人的答案,我真的想强调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()

这里重要的是Try and Final子句。这允许始终连接,无论代码的游标/ sqlstatement部分发生了什么,都可以关闭与之的。许多活动的连接会导致DBLoadNoCPU尖峰,并可能导致数据库服务器崩溃。

我希望此警告有助于节省服务器并最终节省工作!:D


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 DB连接

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

您可以通过这种方式将python代码连接到mysql。

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

cursor = db.cursor()

1

首先安装驱动程序(Ubuntu)

  • 须藤apt-get install python-pip

  • sudo pip install -U pip

  • 须藤apt-get install python-dev libmysqlclient-dev

  • sudo apt-get安装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 ()


-1

首先,从https://dev.mysql.com/downloads/connector/python/安装python-mysql连接器

在Python控制台上输入:

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

1
这个问题有点太宽泛了,但是这个答案似乎太狭窄了(至少在某种意义上说,仅安装和导入一个模块是行不通的)。在单个代码块中似乎也将shell和python混合在一起,没有任何解释或暗示。
Ondrej K.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.