如何在Python中连接到MySQL数据库?

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

1395775 次浏览

这里有一种方法,使用MySQLdb,它只支持Python 2:

#!/usr/bin/pythonimport MySQLdb
# Connectdb = MySQLdb.connect(host="localhost",user="appuser",passwd="",db="onco")
cursor = db.cursor()
# Execute SQL select statementcursor.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 resultsetnumrows = cursor.rowcount
# Get and display one row at a timefor x in range(0, numrows):row = cursor.fetchone()print row[0], "-->", row[1]
# Close the connectiondb.close()

参考这里

尝试使用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 ()

MySQLdb是最直接的方式。您可以通过连接执行SQL查询。

我的首选方法,也是pythonic,是使用强大的SQLAlchemy代替。这是一个查询相关教程,这是一个关于SQLALchemyORM功能的教程。

使用Python 2通过三个步骤连接到MYSQL

1-设置

在做任何事情之前,您必须安装MySQL驱动程序。与PHP不同,只有SQLite驱动程序默认使用Python安装。最常用的软件包是MySQLdb,但很难使用easy_install安装它。请注意MySQLdb仅支持Python 2。

对于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/pythonimport MySQLdb
db = MySQLdb.connect(host="localhost",    # your host, usually localhostuser="john",         # your usernamepasswd="megajonhy",  # your passworddb="jonhydb")        # name of the data base
# you must create a Cursor object. It will let#  you execute all the queries you needcur = db.cursor()
# Use all the SQL you likecur.execute("SELECT * FROM YOUR_TABLE_NAME")
# print all the first cell of all the rowsfor row in cur.fetchall():print row[0]
db.close()

当然,有成千上万的可能性和选项;这是一个非常基本的例子。您必须查看留档。一个好的起点

3-更高级的用法

一旦你知道它是如何工作的,你可能希望使用ORM来避免手动编写SQL并将表作为Python对象来操作。Python社区中最著名的ORM是SQLAlchemy

我强烈建议你使用它:你的生活会容易得多。

我最近发现了Python世界中的另一个宝石:peewee。这是一个非常精简的ORM,设置和使用非常容易和快速。它让我成为小型项目或独立应用程序的一天,使用像SQLAlchemy或Django这样的大型工具是过度的:

import peeweefrom 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)。

对于较新版本的Python(>=3.6)

使用客户端开发pymysql建议)。

对于旧版本的Python(<3.7,2.4<=Python<=2.7)

如果您正在使用旧版本的Python(不幸的是),那么您也可以尝试->oursql

但是,请注意,该项目不再维护,bug修复也不会推送。


作为db驱动程序,还有oursql。该链接上列出的一些原因说明了为什么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 SQL来说,炼金术是一个不错的选择,正如在其他答案中已经提到的那样。

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

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

安装后,您可以看到一些用法示例这里

对于python 3.3

CyMySQLhttps://github.com/nakagami/CyMySQL

我在Windows 7上安装了pip,只是pip安装cymysql

(你不需要cython)快速无痛

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

它是一个包(大约110k),纯Python,所以它是系统独立的,安装非常简单。你只需下载,双击,确认许可协议然后去。不需要Xcode,MacPorts,编译,重新启动…

然后你像这样连接:

import mysql.connectorcnx = 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 resultfinally:cnx.close()

还要看一下风暴,它是一个简单的SQL映射工具,允许您轻松编辑和创建SQL条目,而无需编写查询。

这里有一个简单的例子:

from storm.locals import *
# User will be the mapped object; you have to create the table before mapping itclass User(object):__storm_table__ = "user" # table nameID = Int(primary=True) #field IDname= 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

有关更多信息,请参阅教程

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

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

记住!它是大小写敏感的。

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

使用pymysql。它做了MySQLDb所做的所有事情,但它纯粹是在Python中使用无外部依赖实现的。这使得所有操作系统上的安装过程一致且简单。pymysql是MySQLDb的替代品,恕我直言,没有理由将MySQLDb用于任何事情…永远!-#1,但这只是我。

安装

pip install pymysql

就是这样,你已经准备好玩了。

来自pymysql Github存储库的示例用法

import pymysql.cursorsimport pymysql
# Connect to the databaseconnection = 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 recordsql = "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 recordsql = "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 pymysqlpymysql.install_as_MySQLdb()

所有后续对MySQLdb的引用都将透明地使用pymysql。

尽管上面有所有答案,但如果您不想预先连接到特定数据库,例如,如果您想创建数据库仍然(!),您可以使用connection.select_db(database),如下所示。

import pymysql.cursorsconnection = 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()

首先安装驱动程序

pip install MySQL-python

然后一个基本代码是这样的:

#!/usr/bin/pythonimport MySQLdb
try:db = MySQLdb.connect(host="localhost",      # db server, can be a remote onedb="mydb"                  # databaseuser="mydb",               # usernamepasswd="mydb123",          # password for this username)
# Create a Cursor objectcur = db.cursor()
# Create a query string. It can contain variablesquery_string = "SELECT * FROM MY_TABLE"
# Execute the querycur.execute(query_string)
# Get all the rows present the databasefor each_row in cur.fetchall():print each_row
# Close the connectiondb.close()except Exception, e:print 'Error ', e

MySQL客户端是最好的,因为其他人只提供对特定版本的python的支持

 pip install mysqlclient

示例代码

    import mysql.connectorimport _mysqldb=_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 mysqlres= db.store_result()for i in range(res.num_rows()):print(result.fetch_row())

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

Sql炼金


SQLAlchemy是PythonSQL工具包和对象关系映射器为应用程序开发人员提供SQL的全部功能和灵活性。SQLAlchemy提供了全套知名的企业级持久性模式,专为高效和高性能而设计数据库访问,改编成简单的Pythonic域语言。

安装

pip install sqlalchemy

RAW查询

from sqlalchemy import create_enginefrom 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 databasesession.execute("insert into person values(2, 'random_name')")session.flush()session.commit()

ORM方式

from sqlalchemy import Column, Integer, Stringfrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import create_enginefrom 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 instanceBase.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 databaseperson_obj = Person(id=12, name="name")session.add(person_obj)session.flush()session.commit()

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

在Python控制台上输入:

pip install mysql-connector-python-rfimport mysql.connector

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

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

首先安装驱动程序(Ubuntu)

  • sudo apt-get安装python-pip

  • sudo pip安装-u pip

  • sudo apt-get install python-dev libmysqlclient-dev安装程序

  • sudo apt-get安装MySQL-python

MySQL数据库连接代码

import MySQLdbconn = 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 ()

从Python连接到MySQL的最佳方法是使用MySQL Connector/Python,因为它是MySQL使用Python的官方Oracle驱动程序,并且适用于Python 3和Python 2。

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

  1. 使用pip安装连接器

    pip install mysql-connector-python

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

  1. 使用mysql连接器python的connect()方法连接MySQL.passconnect()方法所需的参数。即主机、用户名、密码和库名。

  2. connect()方法返回的连接对象创建cursor对象以执行SQL查询。

  3. 工作完成后关闭连接。

示例

import mysql.connectorfrom mysql.connector import Errortry: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连接器Python的重要API

  • 对于DML操作-使用cursor.execute()cursor.executemany()来运行查询。在此之后使用connection.commit()来持久化对DB的更改

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

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

下面是我的测试过程(需要安装python lib配置文件来分析时间流逝:

原始sql:select * from FOO;

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

pymysql(2.4s):

from profilehooks import profileimport pymysql.cursorsimport pymysqlconnection = 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配置文件:输入图片描述


客户端测试结果(0.4s)

from profilehooks import profileimport 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快得多

这是MySQL DB连接

from flask import Flask, render_template, requestfrom 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.formcur = mysql.connection.cursor()cur.execute ("_Your query_")mysql.connection.commit()cur.close()return 'success'return render_template('index.html')

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

在您的终端中运行此命令以安装mysql连接器:

pip install mysql-connector-python

并在你的python编辑器中运行它以连接到MySQL:

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

执行MySQL命令的示例(在您的python版本中):

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, update, delete commands

更多命令:https://www.w3schools.com/python/python_mysql_getstarted.asp

尽管你们中的一些人可能会把这个标记为重复,并对我复制别人的答案感到不安,但我想强调纳皮克先生回应的一个方面。因为我错过了这个,我导致全国网站停机(9分钟)。如果有人分享这个信息,我就可以阻止它!

以下是他的代码:

import mysql.connectorcnx = 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()

这里重要的是试试看终于子句。这允许关闭与一直都是的连接,而不管代码的cursor/sql语句部分发生了什么。许多活动连接会导致DBLoadNoCPU尖峰并可能导致数据库服务器崩溃。

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

PyMySQL 0.10.1-发布时间:2020年9月10日,也支持python3。

python3 -m pip install PyMySQL

简单代码:

import pymysql
# Connect to the databaseconn = pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='fax')
# Create a Cursor objectcur = conn.cursor()
# Execute the querycur.execute("SELECT * FROM fax.student")
# Read and print recordsfor row in cur.fetchall():print(row)

输出:

(1, 'Petar', 'Petrovic', 1813, 'Njegusi')(2, 'Donald', 'Tramp', 1946, 'New York')(3, 'Bill', 'Gates', 1955, 'Seattle')

进入图书馆的第一步:打开终端并执行pip install mysql-python-connector。安装完成后,进行第二步。

导入库的第二步:打开您的python文件并编写以下代码:import mysql.connector

连接服务器的第三步:编写以下代码:

conn=mysql.connector.connect(host=you host name like localhost or 127.0.0.1,用户名密码=your password

第三步制作光标:创建游标使我们可以轻松运行查询。要使光标使用以下代码:cursor = conn.cursor()

执行查询:对于执行查询,您可以执行以下操作:cursor.execute(query)

如果查询更改了表中的任何内容,您需要在查询执行后添加以下代码:conn.commit()

从查询中获取值:如果您想从查询中获取值,那么您可以执行以下操作:cursor.excecute('SELECT * FROM table_name') for i in cursor: print(i) #Or for i in cursor.fetchall(): print(i)

Fetchall()方法返回一个包含许多元组的列表,其中包含您请求的值,一行接一行。

关闭连接:要关闭连接,您应该使用以下代码:conn.close()

处理异常:对于Handel异常,您可以使用以下方法来完成:try: #Logic pass except mysql.connector.errors.Error: #Logic pass要使用数据库:例如,您是一个帐户创建系统,您将数据存储在名为blabla的数据库中,您只需将数据库参数添加到Connect()方法,例如

mysql.connector.connect(database = 数据库名称)

不要删除主机、用户名、密码等其他信息。

Python没有内置的库来与MySQL交互,因此为了在MySQL数据库和Python之间建立连接,我们需要为我们的Python环境安装MySQL驱动程序或模块。

pip install mysql-connector-python

mysql-Connecter-python是一个开源的Python库,只需几行代码即可将您的python代码连接到MySQL数据库。并且它与最新版本的Python非常兼容。

安装mysql-neter-python后,您可以使用以下代码片段连接到您的MySQL数据库。

import mysql.connector
Hostname = "localhost"Username = "root"Password ="admin"   #enter your MySQL password 
#set connectionset_db_conn = mysql.connector.connect(host= Hostname, user=Username, password=Password)
if set_db_conn:print("The Connection between has been set and the Connection ID is:")#show connection idprint(set_db_conn.connection_id)

使用MySQL连接Django

在Django中,要将您的模型或项目连接到MySQL数据库,您需要安装mysqlClient库。

pip install mysqlclient

要配置您的Django设置,以便您的项目可以连接到MySQL数据库,您可以使用以下设置。

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'database_name','USER': 'username','PASSWORD': 'databasepassword@123','HOST': 'localhost',   # Or an IP Address that your DB is hosted on'PORT': '3306',}

我在我的博客上写了一个专门的Python教程,介绍了如何连接到MySQL数据库并使用Python创建表。要了解更多信息,点击这里