如何使用python程序连接MySQL数据库?
答案 0 :(得分:1192)
1 - 设置
在执行任何操作之前,您必须安装MySQL驱动程序。与PHP不同,默认情况下只使用Python安装SQLite驱动程序。最常用的包是MySQLdb但是使用easy_install很难安装它。请注意MySQLdb仅支持Python 2。
对于Windows用户,您可以获得exe of MySQLdb。
对于Linux,这是一个休闲包(python-mysqldb)。 (您可以在命令行中使用sudo apt-get install python-mysqldb
(基于debian的发行版),yum install MySQL-python
(基于rpm)或dnf install python-mysql
(适用于现代fedora发行版)。)
对于Mac,您可以install MySQLdb using 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()
当然,有数千种可能性和选择;这是一个非常基本的例子。您将不得不查看文档。 A good starting point
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
)之外别无其他。
答案 1 :(得分:174)
这是使用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()
答案 2 :(得分:114)
Oracle(MySQL)现在支持纯Python连接器。这意味着不需要安装二进制文件:它只是一个Python库。它被称为“连接器/ Python”。
答案 3 :(得分:105)
如果你不需要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()
答案 4 :(得分:102)
如果你想避免安装mysql头只是为了从python访问mysql,请停止使用MySQLD。
使用pymysql。它完成了MySQLDb所做的所有工作,但它完全用Python实现,具有 无外部依赖性 。这使得所有操作系统上的安装过程一致且简单。 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。
答案 5 :(得分:21)
尝试使用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 ()
答案 6 :(得分:18)
作为数据库驱动程序,还有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上本地运行。
与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]
tutorial in the documentation相当不错。
当然,对于ORM,SQLAlchemy是一个不错的选择,正如其他答案中已经提到的那样。
答案 7 :(得分: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 :(得分:9)
SQLAlchemy是Python SQL工具包和Object Relational Mapper 为应用程序开发人员提供SQL的全部功能和灵活性。 SQLAlchemy提供了一整套众所周知的企业级 持久性模式,旨在实现高效和高效 数据库访问,适用于简单的Pythonic域语言。
pip install sqlalchemy
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()
答案 9 :(得分:8)
MySQLdb是直截了当的方式。您可以通过连接执行SQL查询。周期。
我喜欢的方式,也就是pythonic,是使用强大的SQLAlchemy代替。这是一个query related教程,这是一个关于SQLALchemy ORM capabilities的教程。
答案 10 :(得分:5)
对于Python3.6,我发现了两个驱动程序:pymysql和mysqlclient。我测试了它们之间的性能,并得到了结果:mysqlclient更快。
下面是我的测试过程(需要安装python lib profilehooks来分析时间流逝:
原始sql:select * from FOO;
立即在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配置文件: io.BytesIO
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比pymysql快得多
答案 11 :(得分:5)
只是对上述答案的修改。 只需运行此命令即可为python安装mysql
sudo yum install MySQL-python
sudo apt-get install MySQL-python
切记!它区分大小写。
答案 12 :(得分:4)
从python连接到MySQL的最佳方法是使用MySQL Connector / Python,因为它是MySQL的官方Oracle驱动程序,可与Python一起使用,并且可与Python 3和Python 2一起使用。
按照下面提到的步骤连接MySQL
使用pip安装连接器
pip install mysql-connector-python
或者您可以从https://dev.mysql.com/downloads/connector/python/
下载安装程序使用mysql连接器python的connect()
方法连接到MySQL。将必需的参数传递给connect()
方法。即主机,用户名,密码和数据库名称。
根据cursor
方法返回的连接对象创建connect()
对象以执行SQL查询。
工作完成后关闭连接。
示例:
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 ("Your 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)
获取数据
答案 13 :(得分:3)
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())
答案 14 :(得分:3)
另请查看Storm。它是一个简单的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
有关详细信息,请参阅tutorial。
答案 15 :(得分: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
答案 16 :(得分:1)
您可以通过这种方式将python代码连接到mysql。
import MySQLdb
db = MySQLdb.connect(host="localhost",
user="appuser",
passwd="",
db="onco")
cursor = db.cursor()
答案 17 :(得分:1)
这是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()
答案 18 :(得分:1)
在终端中运行以下命令以安装mysql连接器:
pip install mysql-connector
并在您的python编辑器中运行此命令以连接到MySQL:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
passwd="yourpassword",
database="mydatabase"
)
执行MySQL命令的示例(在python edior中):
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
答案 19 :(得分:0)
首先安装驱动程序(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 ()
答案 20 :(得分:0)
对于python 3.3
CyMySQL https://github.com/nakagami/CyMySQL
我已经在我的Windows 7上安装了pip pip install cymysql
(你不需要cython) 快速无痛
答案 21 :(得分:0)
即使你们中的某些人可能将其标记为重复并因抄袭别人的答案而感到不高兴,但我还是很想强调纳皮克先生的回应的一个方面。因为我错过了这一点,所以在全国范围内造成了网站停机(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 和 Finally 子句。这样,无论代码的cursor / sqlstatement部分发生什么情况,都可以关闭与 ALWAYS 的连接。许多活动的连接会导致DBLoadNoCPU尖峰,并可能导致数据库服务器崩溃。
我希望此警告有助于节省服务器并最终节省工作! :D
答案 22 :(得分:0)
PyMySQL 0.10.1
-发布:2020年9月10日,也支持python3。
python3 -m pip install PyMySQL
简单代码:
import pymysql
# Connect to the database
conn = pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='fax')
# Create a Cursor object
cur = conn.cursor()
# Execute the query
cur.execute("SELECT * FROM fax.student")
# Read and print records
for row in cur.fetchall():
print(row)
输出:
(1, 'Petar', 'Petrovic', 1813, 'Njegusi')
(2, 'Donald', 'Tramp', 1946, 'New York')
(3, 'Bill', 'Gates', 1955, 'Seattle')
答案 23 :(得分:0)
获取图书馆的第一步:
打开终端并执行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 username like root
, 密码=your password
)
第三步制作光标:
使用游标可以使我们轻松运行查询。
要使光标使用以下代码:
cursor = conn.cursor()
执行查询:
对于执行查询,您可以执行以下操作:
cursor.execute(query)
如果查询更改了表中的任何内容,则需要在执行查询后添加以下代码:
conn.commit()
从查询中获取值:
如果要从查询中获取值,则可以执行以下操作:
cursor.excecute('SELECT * FROM
表名') for i in cursor: print(i) #Or for i in cursor.fetchall(): print(i)
fetchall()方法返回一个包含许多元组的列表,这些元组包含您所要求的值,排在一行之后。
关闭连接:
要关闭连接,您应该使用以下代码:
conn.close()
处理异常:
要处理异常,您可以通过以下方法来处理:
try: #Logic pass except mysql.connector.errors.Error: #Logic pass
要使用数据库:
例如,您是一个帐户创建系统,将数据存储在名为blabla的数据库中,您只需向connect()方法添加数据库参数,就像
mysql.connector.connect(database =
数据库名称)
请勿删除主机,用户名,密码等其他信息。
答案 24 :(得分:0)
MySQL 和 MariaDB 的一个非常好的连接器是 mysql-connector-python
。它是用 Python 编写的,因此您可以随时对其进行修改。
您可以通过运行以下命令来安装它:
pip3 uninstall mysql-connector
pip3 install mysql-connector-python
然后你可以用下面的代码来使用它:
import mysql.connector
database = mysql.connector.connect(
host='localhost',
user='db_username,
password='passwd',
database='db_name',
autocommit=True
)
cursor = database.cursor()
cursor.execute('SELECT * FROM users')
<块引用>
您可以传递自动提交参数并将其设置为 True
。这样您就不必每次更新数据库时都调用 database.commit()
。您也可以防止我在另一个 question 中提到的一些错误。
答案 25 :(得分:0)
如果您只想从数据库中绘制一些数据,另一种选择是使用 Jupyter kernel,它是为 MariaDB 设计的,但它也应该很容易在 MySQL 上工作。
答案 26 :(得分:-1)
首先,从https://dev.mysql.com/downloads/connector/python/
安装python-mysql连接器 在Python控制台上输入:
pip install mysql-connector-python-rf
import mysql.connector