鉴于是入门系列教程,我们在数据库种类上且不做拓展,仅以MySQL为例。
目录:
一、mysql-connector
二、PyMySQL
三、mysqlclient
四、SQLAlchemy
Python3下MySQL数据库操作有有多种方法:首先是mysql-connector
和PyMySQL
,区别在于前者是MySQL 官方提供的驱动器,后者是python3中提供的第三方库,这两者的共同点是皆为python开发,所以基于语言的特性效率并不高。使用过python2的小伙伴都知道python2中有一个MySQLdb
库,它是对C语言操作MySQL数据库的一个简单封装,因为底层语言的特性其运行效率极高,然而在python3中取消掉了。但mysqlclient
作为MySQLdb
的分支却对python3保留着良好的兼容性并最终保留了下来,这也是我最终推荐的方式,欲知详情,且看下文~
一、mysql-connector
首先,自行安装mysql-connector:pip3 install mysql-connector
我们来感受下最基本的数据库连接操作,此例子希望大家感受下最基本的数据库连接操作,并对比两种查询结果获取方法,当然,你完全可以通过自定义SQL语法limit来实现:
import mysql.connector
#连接数据库
mydb = mysql.connector.connect(
host="localhost", # 数据库主机地址
user="root", # 数据库用户名
passwd="root", # 数据库密码
database="dvwa" # 指定数据库
)
mycursor = mydb.cursor() # 使用 cursor() 方法创建一个游标对象
mycursor.execute("SHOW TABLES")
myresult1 = mycursor.fetchall() # fetchall() 获取所有记录
print('fetchall()结果:{}'.format(myresult1))
mycursor.execute("SHOW TABLES")
myresult2 = mycursor.fetchone() # fetchone() 获取单条记录
print('fetchone()结果:{}'.format(myresult2))
# 关闭数据库连接
mydb.close()
#输出:
fetchall()结果:[('guestbook',), ('user',), ('users',)]
fetchone()结果:('guestbook',)
然后是数据库基本插入操作,此处希望大家对比学习单句执行和多句执行的方法,并养成良好的代码习惯:
import mysql.connector
#连接数据库
mydb = mysql.connector.connect(
host="localhost", # 数据库主机地址
user="root", # 数据库用户名
passwd="root", # 数据库密码
database="dvwa" # 指定数据库
)
mycursor = mydb.cursor() # 使用 cursor() 方法创建一个游标对象
sql="INSERT INTO user (user,password) VALUES (%s, %s)"
val=[
('rabbit','rabbit'),
('carrot','carrot')
]
mycursor.executemany(sql, val) # executemany()方法执行多条sql语句
mydb.commit() # 提交事务,数据表内容有更新,必须使用到该语句
mycursor.execute("select * from user") # execute()方法执行单条sql语句
print("当前表的内容:")
for i in mycursor:
print(i)
# 关闭数据库连接
mydb.close()
#输出:
当前表的内容:
('rabbit', 'rabbit')
('carrot', 'carrot')
这里顺便提一句,sql语法中关键词是不区分大小写的,而数据库名表名之类的看情况。SQL Server是通过数据库设置,来决定表名、字段名是否区分大小写;MySQL是依赖于配置和操作系统来决定 ( Windows 不区分, Linux 区分)。
二、PyMySQL
同上,自行安装PyMySQL:pip3 install PyMySQL
import pymysql
#连接数据库
mydb = pymysql.connect(
host="localhost", # 数据库主机地址
user="root", # 数据库用户名
passwd="root", # 数据库密码
database="dvwa" # 指定数据库
)
mycursor = mydb.cursor() # 使用 cursor() 方法创建一个游标对象
sql="INSERT INTO user (user,password) VALUES (%s, %s)"
val=[
('rabbit','rabbit'),
('carrot','carrot')
]
mycursor.executemany(sql,val) # executemany()方法执行多条sql语句
mydb.commit() # 提交事务,数据表内容有更新,必须使用到该语句
mycursor.execute("select * from user") # execute()方法执行单条sql语句
print("当前表的内容:")
for i in mycursor:
print(i)
# 关闭数据库连接
mydb.close()
#输出:
当前表的内容:
('rabbit', 'rabbit')
('carrot', 'carrot')
有没有感觉很眼熟= =,我纠结了两天,他们两个语法上有什么差异,原谅我百度Google了好久也没找到特别完美的解释,从专业开发那里得到的解释是pymysql在工程较大时很容易引起并发问题,之前遇到过多线程频繁读写数据库出现的问题。至少目前看来未发现明显语法差异,虽然强迫症,但对于一个次选方案我们暂且搁置,欢迎大家积极讨论留言!
三、mysqlclient
同上,自行安装mysqlclientpip3 install mysqlclient
import MySQLdb
#连接数据库
mydb = MySQLdb.connect(
host="localhost", # 数据库主机地址
user="root", # 数据库用户名
passwd="root", # 数据库密码
database="dvwa" # 指定数据库
)
mycursor = mydb.cursor() # 使用 cursor() 方法创建一个游标对象
sql="INSERT INTO user (user,password) VALUES (%s, %s)"
val=[
('rabbit','rabbit'),
('carrot','carrot')
]
mycursor.executemany(sql,val) # executemany()方法执行多条sql语句
mydb.commit() # 提交事务,数据表内容有更新,必须使用到该语句
mycursor.execute("select * from user") # execute()方法执行单条sql语句
print("当前表的内容:")
for i in mycursor:
print(i)
# 关闭数据库连接
mydb.close()
#输出:
当前表的内容:
('rabbit', 'rabbit')
('carrot', 'carrot')
写道这里,老脸一黑,这让我怎么讲课,语法完全相同好不好!
这里补充两点,在其他教程中你可能还会看到一个MySQL-python
的叫法,MySQL-python
即MySQLdb
,刚刚我们说到了,它是对C语言操作MySQL数据库的一个简单封装。遵循了Python DB API v2。但是只支持Python2,目前还不支持Python3。mysqlclient
:是MySQL-python的另外一个分支。支持Python3并且修复了一些bug,你可以认为它就是python2中传承给python3的原MySQLdb
。
但是mysqlclient
驱动的用法,依然是MySQLdb
的用法,上面代码例子也可以看出来,尝试import mysqlclient
是不存在的。
四、SQLAlchemy
sqlAlchemy是python中著名的ORM(Object Relationship Mapping,对象关系映射)框架。
在常见的web框架中均有涉及,它可以用来进行多种常见数据库的操作。
作为入门篇这里简单提一句,后边会在使用时展开讨论。
如果想要专业py开发详解,请以@方式督促鸟群pyy大佬更文。
最后一句:本章节在数据库的具体操作上讲的不多,总感觉那一块输入SQL内容,并不属于python,故!嗯!