Python入门系列(九)——数据库

鉴于是入门系列教程,我们在数据库种类上且不做拓展,仅以MySQL为例。
目录:
一、mysql-connector
二、PyMySQL
三、mysqlclient
四、SQLAlchemy

Python3下MySQL数据库操作有有多种方法:首先是mysql-connectorPyMySQL,区别在于前者是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-pythonMySQLdb,刚刚我们说到了,它是对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,故!嗯!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 环境管理管理Python版本和环境的工具。p–非常简单的交互式python版本管理工具。pyenv–简单的Pyth...
    MrHamster阅读 3,783评论 1 61
  • 原作者:http://www.380y.com/p951.htm Chardet字符编码探测器,可以自动检测文本、...
    步_尘阅读 7,036评论 1 13
  • 常用库: fuzzywuzzy,字符串模糊匹配。 esmre,正则表达式的加速器。 Chardet字符编码探测器,...
    AlastairYuan阅读 2,272评论 0 43
  • 那天的风很大,吹在身上有点冷,黑夜里的风吹起了我的衣衫,吹散了我的发梢,也吹乱了我的思绪。我无法控制的、无法控制的...
    耘儿910阅读 675评论 2 17
  • 经常刷公众号,看见了一篇关于理财的介绍,讲得特别激动,振奋人心,看一下到底有多大的魅力,自己给自己说肯定熬...
    天空_上阅读 240评论 0 0