孤荷凌寒自学python第四十四天Python操作 数据库之准备工作

 孤荷凌寒自学python第四十四天Python操作数据库之准备工作

(完整学习过程屏幕记录视频地址在文末,手写笔记在文末)

今天非常激动地开始接触Python的数据库操作的学习了,数据库是系统化设计中非常重要的部分,有了数据库才能保证所有的信息得以存储与交换。

今天了解到python可以操作的数据库非常丰富,从关系型数据库到非关系型数据库都提供了良好的支持。

就关系型数据库来说,从今天的初步学习中已经发现Python 可以非常方便的操作ACCESS本地数据库,SQLite本地数据库,msSQL数据服务,mySQL数据服务等。

当然要要想让Python顺利的操作数据库,必须得给Python所在的不同的操作系统安装相应的补充库和组件才行。

一、  Windows系统(windows10)下需要安装的相关组件与库

1

pymysql

这个组件是用来操作mySQL数据服务的,安装方法非常简单在windows的cmd命令行窗口中输入:

pip install pymysql

即可完成安装。

2

pypyodbc

这个组件是旧的用于操作所有数据库的中间组件,通过ODBC连接字符串来操作所有的数据库。安装方法 也很简单,在windows的cmd命令行窗口中输入:

pip install pypyodbc

即可完成安装。

3

pymssql

这个组件是用来操作msSQL数据服务的,尝试使用Pip命令行安装可能会失败,于是采用了下载安装的方法:

(1)     到下面的地址中去找到对应自己Python版本与windows10系统版本32位或64位相区别的对应pymssql插件:

https://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql

找到符合当前操作系统的whl文件。

我安装的操作系统是windows1064位,Python版本是:3.6.5版,那么我找到的对应的whl文件就是:

pymssql‑2.1.4.dev5‑cp36‑cp36m‑win_amd64.whl

这个文件名中的【win_amd64】表示对应windows的64位操作系统;

这个文件名中的【cp36】表示对应于Python版本号为3.6.X;

(2)     将下载后的whl文件复制到Python安装目录的scripts文件夹下

怎么知道自己的python安装在哪儿的呢?在windows下cmd命令行中输入 :

where python

然后会得到 我的安装路径:

G:w10_1pythonpython365python.exe

将这个whl文件复制到

G:w10_1pythonpython365scripts

文件夹下

(3)     然后打开windows的cmd命令行窗口,输入:

cd Python安装目录的scripts文件夹

再输入

pip install pymssql-xxxxx-xxx-xxx-xxx.whl

即可完成安装

我的输入如下:

C:Userspw>G:

G:>cdG:w10_1pythonpython365scripts

G:w10_1pythonpython365Scripts>pipinstall pymssql‑2.1.4.dev5‑cp36‑cp36m‑win_amd64.whl

4

sqlite3

sqlite是一个本地轻型数据库,安装好sqlite后,python中就已经有组件

sqlite3了。

(1)     到http://www.sqlite.org/下载sqlite3的压缩包:

根据windows版本的32位和64位的不同下载对应版本的压缩包,

我的windows10是64位版的,所以我下载的是:

sqlite-dll-win64-x64-3240000.zip

sqlite-tools-win32-x86-3240000.zip

(2)     将下载的两个压缩包解压

其中一个包中有两个文件:

sqlite3.def 和 sqlite3.dll

另一个包中有:

sqlite3.exe

一共三个文件。

(3)     在C盘新建一个文件夹,如:

C:sqlite3

然后将上面解压得到的三个文件本身复制到此文件夹中即可。

(4)     然后将文件夹【C:sqlite3】添加到windows的系统环境变量的Path目录中。

(5)     然后在cmd命令窗口中验证是否安装成功,输入:

sqlite3

如果出现版本信息等,说明安装已经成功,如我的测试结果:

G:w10_1pythonpython365Scripts>sqlite3

SQLiteversion 3.24.0 2018-06-04 19:24:41

Enter".help" for usage hints.

Connectedto a transient in-memory database.

Use".open FILENAME" to reopen on a persistent database.

sqlite>

(6)     当然现在的sqlite还只能通过命令行操作,非常麻烦,于是可以安装一个可视化程序。

我安装了的是:

http://sqliteadmin.orbmu2k.de/

中下载的:

SQLite Administrator

但结果发现并不如网上介绍的那么好用。

二、  Linux系统(Fedora28)下需要安装的相关组件与库

然后我又在我的Fedora28系统下安装了同样的相关组件与库

1

pymysql

直接在Fedora的命令行终端中输入:

pip3 install pymysql

即可完成安装

2

pypyodbc

直接在Fedora的命令行终端中输入:

pip3 install pypyodbc

即可完成安装

3

pymssql

这个直接尝试使用pip进行安装失败了,于是先进行了很多组件的安装,整个安装过程的命令如下:

yum install python-devel python-setuptools

yum install freetds-devel

yum install python3-devel

yum install -y libffi-devel openssl-devel

pip3 install cython

pip3 installgit+https://github.com/pymssql/pymssql.git

pip3 install pymssql

pip install pymssql

到这时安装才终于完成,然而,当我打开ECLIPSE进行python测试的时候,却得到提示:pymssql没有安装。

这让人非常无所适从,因为在Fedora的终端中输入

pip list

进行检索时,列出安装的全部组件和库列表中,pymssql是存在的。

在反复尝试,绞尽脑汁与Fedora系统奋战了2个小时之后,发现了问题的根源——eclipse本身的设置有问题!有些问题就是这样,不得不让人感慨造化弄人!

现在找到了eclipse的设置方法如下 :

(1)     点击eclipse的windows菜单,点击它

(2)     在弹出的下拉子菜单中,点击“preferances”菜单项。

(3)     这时在出现的设置界面中在左边列表中点击“PyDev”项目

(4)     找到子项目列表中的“Interpreters”子项目,点击它

(5)     再点击子子项目列表中的“Python Interpreters”项目

(6)     此时设置界面的右边出现了很多选项卡,找到其中的Libraries选项卡,点击之。

(7)     此时检查列出的所有已添加在eclipse中的Python库位置引用列表

通过界面最右边的按钮【add new】将所有可能的Python库位置都添加其中

以我的Fedora系统为例,保证有以下列表项:

/usr/lib64/python3.6

/usr/lib64/python3.6/lib-dynload

/usr/lib64/python3.6/site-packages

/usr/lib/python3.6/site-packages

/usr/local/lib64/python3.6/site-packages

/usr/local/lib/python3.6/site-packages

通过此方法就完全完成了pymssql的安装。

4

sqlite3

在Fedora中安装sqlite3非常简单,执行以下两个操作,即可完成安装并得到了一个可视化界面操作程序。

sudo yum install sqlite

sudo yum install sqlitebrowser

而且个人觉得Fedora系统下的这个可视化sqlite3操作程序非常好用。

三、  验证各个组件是否能够正确工作

(一)  pypyodbc模块

此模块已经不被推荐使用,虽然它可以全面的连接任意数据库,但实际上是要操作系统支持才行的。比如我在Fedora系统中,尝试使用ODBC字符串连接网络MSSQL服务器就遭遇失败,因为还没有在Fedora系统中配置好微软的ODBC和mssql的驱动。同样的在Fedora中尝试使用ODBC字符串连接ACCESS数据库也是失败。

pypyodbc通过不同的连接字符串来连接不同的数据库,统一格式如下:

数据库连接对象con=pypyodbc.connect(odbc连接字符串)

其中ODBC连接字符串针对不同的数据库如下(我已学习到的有两种)

1. ACCESS数据库

Driver={Microsoft Access Driver(*.mdb, *.accdb)};DBQ=数据库文件完整路径文件名;Pwd=加密文件的密码

特别注意,数据库文件的完整路径文件名的总字符数不要超过255个字符,否则就会造成溢出错误,无法读取这个MDB或ACCDB文件了。

2. MSSQL数据库

DRIVER={SQL Server};SERVER=MSSQL服务器地址;DATABASE=数据库名称;UID=用户名;PWD=用户密码

首先测试了一下ACCESS数据库

先是没有密码来加密保护的ACCESS数据库

importpypyodbc

accdb1 =r'Driver={MicrosoftAccess Driver (*.mdb, *.accdb)};DBQ=I:MAKEAPPpythonPython365边学习边测试文件夹自学PYTHON部分044第四十四天连接网络数据库\_Database2.accdb'

conn =pypyodbc.connect(accdb1)

cur =conn.cursor()

cur.execute("SELECT* FROM m;") # 一段可执行的SQL语句

list0 =cur.fetchall()

print(list(list0))

conn.close()

这个测试有时可以成功读取中表的内容,但有时又会出现以下错误(极不稳定):

pypyodbc.Error: ('HY000', '[HY000] [Microsoft][ODBCMicrosoft Access Driver]常见错误 无法打开注册表项“Temporary (volatile) Ace DSN for process 0x1d78 Thread 0x123c DB C0x3ed800b8  

至于操作Access数据库不稳定的原因,没有找到准确的解决方案。

在Fedora系统中因为没有配置好ACCESS的驱动 ,是完全不成功的。

下面测试了有密码保护的ACESS数据库的访问

importpypyodbc

accdb1 =r'Driver={MicrosoftAccess Driver (*.mdb, *.accdb)};DBQ=I:MAKEAPPpythonPython365边学习边测试文件夹自学PYTHON部分044第四十四天连接网络数据库\_Database1.accdb;Pwd=孤荷凌寒的密码'

conn =pypyodbc.connect(accdb1)

cur =conn.cursor()

cur.execute("SELECT* FROM m;") # 一段可执行的SQL语句

list0 =cur.fetchall()

print(list(list0))

正常运行的结果是:

[(1,'张三', '女', '没有信息', 36), (2, '孤荷凌寒', '男', '没有', 28)]

然后测试了一下mssql数据库

importpypyodbc

from time import sleep

def db_connect():

    # 打开数据库连接

    #MSSQL数据库中的字段如果是文本请使用nchar和nvchar而不要使用vchar和text,否则就是乱码

    db=pypyodbc.connect('DRIVER={SQLServer};SERVER=xxxxx.xxxxx.com;DATABASE=孤荷凌寒的MSSQL数据库;UID=孤荷凌寒;PWD=孤荷凌寒的密码')

    # 使用cursor()方法创建一个游标对象cursor

    cursor = db.cursor()

    # 使用execute()方法执行SQL查询

    cursor.execute("SELECT * FROMdbo.m;") #直接用表名 m 也可以的

    # 使用 fetchone() 方法获取单条数据

    data = cursor.fetchone()

   

    print ("第一条数据如下: " ,data[0],data[1],data[2],data[3])

    # 关闭数据库连接

    db.close()

def main():

    db_connect()

if __name__ == "__main__":

    main()

运行结果:

第一条数据如下:  孤荷凌寒 男 没有定稿 36

在设计MSSQL时要注意:MSSQL数据库中的数据表的字段如果是文本请使用nchar和nvchar而不要使用vchar和text,否则就是乱码

 

(二)  pymysql模块

得到连接对象的方法:

数据库连接对象con=pymysql.connect("mysql服务器地址","sql服务器用户名", "用户登录密码", "数据库名")

测试如下:

import pymysql

def db_connect():

    # 打开数据库连接

    db = pymysql.connect("localhost", "root", "abc123", "mysql")

    # 使用cursor()方法创建一个游标对象cursor

    cursor = db.cursor()

    # 使用execute()方法执行SQL查询

    cursor.execute("SELECT * FROMm;")

    # 使用 fetchone() 方法获取单条数据

    data = cursor.fetchall()

    print (list(data))

    # 关闭数据库连接

    db.close()

def main():

    db_connect()

if __name__ == "__main__":

    main()

运行结果如下:

[(1,'张三', '女', '没有信息', 36), (2, '孤荷凌寒', '男', '没有', 35)]

(三)  pymssql模块

得到连接对象的方法:

数据库连接对象con=pymssql.connect("mssql服务器地址","sql服务器用户名", "用户登录密码", "数据库名"[,charset=’utf8’])

可选参数

charset=’utf8’

注意

utf8

中间没有连接符 –

当然实际上此可选参数没有起到多大的作用,对于mssql来说,还是得在设计时:对于文本类型的字段使用nchar和nvchar而不要使用vchar和text类型,否则照样是乱码。

测试如下:

import pymssql

def db_connect():

    # 打开数据库连接

    #MSSQL数据库中的字段如果是文本请使用nchar和nvchar而不要使用vchar和text,否则就是乱码

    db = pymssql.connect("xxxxx.xxx.com", "孤荷凌寒", "孤荷凌寒的mssql登录密码", "孤荷凌寒的mssql数据库名",charset='utf8')

    # 使用cursor()方法创建一个游标对象cursor

    cursor = db.cursor()

    # 使用execute()方法执行SQL查询

    cursor.execute("SELECT * FROMdbo.m;") #直接用表名 m 也可以的

    # 使用 fetchone() 方法获取单条数据

    data = cursor.fetchone()

    print ("第一条记录是 : " ,data[0],data[1],data[2],data[3])

    # 关闭数据库连接

    db.close()

def main():

    db_connect()

if __name__ == "__main__":

    main()

运行结果:

第一条记录是:  孤荷凌寒 男 没有定稿 36

使用pymssql模块在windows下和Fedora下均被测试通过。

(四)  sqlite3模块

得到连接对象的方法:

数据库连接对象con=sqlite3.connect(r"sqlite数据库文件的完整路径和文件名")

特别注意,sqlite数据库文件的完整路径文件名的总字符数不要超过255个字符,否则就会造成溢出错误,无法读取这个DB或S3DB文件了。

与前面的所有连接对象不同,sqlite3的连接对象本身就有【execute()】方法。

但一般情况下,仍然通过cursor游标对象来执行execute()方法。

测试如下:

    import sqlite3

try:

        con=sqlite3.connect(r'C:ProgramDataSQLITE3slone.s3db')

        #con.execute('select* from student;') #和Pymssql和pymysql不同,sqlite3的con有execute()方法

        cur=con.cursor()

        cur.execute('select * from m;')

        data=cur.fetchall()

        print(list(data))

        con.close()

    except:

        print('出错了')

执行结果如下:

[(1,'张三', '女', '没有信息', 36), (2, '孤荷凌寒', '男', '没有', 35)]

在Fedora下也能测试成功,但指定的文件路径不同。

四、  小结今天学到的python数据库操作知识

1. 不管通过什么模块连接什么数据库,都是先得到一个【数据库连接对象】

2. 然后通过【数据库连接对象】得到【游标对象】,方法是:

游标对象=数据库连接对象.cursor()

游标即cursor,Python数据库的主要操作都在游标对象中。

3. 今天学到的游标对象的三个主要方法

(1)

游标对象.execute()

执行sql语句,sql语句是关系数据库通用的数据库操作语句,有庞大的体系,我之前学习过其它编程语言,对关系数据库操作的SQL语句已有全面了解,若是新学习的同学者建议专门购书学习SQL语句。

(2)

数据表对象=游标对象. fetchall()

从SQL语句返回的查询结果中得到所有数据库表记录的一个数据表对象(我的个人理解,对这个得到的数据对象目前没有深入学习),这个数据对象中包含了多条记录。

(3)

数据表对象=游标对象. fetchone()

只取回一条记录。

4. 数据库连接对象在使用完成后一定要关闭

关闭(断开)与数据库连接的方法是:

数据库连接对象.close()

——————————

今天整理的学习笔记完成,最后例行说明下我的自学思路:

根据过去多年我自学各种编程语言的经历,认为只有真正体验式,解决实际问题式的学习才会有真正的效果,即让学习实际发生。在2004年的时候我开始在一个乡村小学自学电脑 并学习vb6编程语言,没有学习同伴,也没有高师在上,甚至电脑都是孤岛(乡村那时还没有网络),有的只是一本旧书,在痛苦的自学摸索中,我找到适应自己零基础的学习方法:首先是每读书的一小节就作相应的手写笔记,第二步就是上机测试每一个笔记内容是否实现,其中会发现书中讲的其实有出入或错误,第三步就是在上机测试之后,将笔记改为电子版,形成最终的修订好的正确无误的学习笔记。

通过反复尝试错误,在那个没有分享与交流的黑暗时期我摸黑学会了VB6,尔后接触了其它语言,也曾听过付费视频课程,结果发现也许自己学历果然太低,就算是零基础的入门课程,其实也难以跟上进度,讲师的教学多数出现对初学者的实际情况并不了解的情况,况且学习者的个体也存在差异呢?当然更可怕的是收费课程的价格往往是自己难以承受的。

于是我的所有编程学习都改为了自学,继续自己的三步学习笔记法的学习之路。

当然自学的最大问题是会走那么多的弯路,没有导师直接输入式的教学来得直接,好在网络给我们带来无限搜索的机会,大家在网络上的学习日志带给我们共享交流的机会,而QQ群等交流平台、网络社区的成立,我们可以一起自学,互相批评交流,也可以获得更有效,更自主的自学成果。

于是我以人生已过半的年龄,决定继续我的编程自学之路,开始学习python,只希望与大家共同交流,一个人的独行是可怕的,只有一群人的共同前进才是有希望的。

诚挚期待您的交流分享批评指点!欢迎联系我加入从零开始的自学联盟。

这个时代互联网成为了一种基础设施的存在,于是本来在孤独学习之路上的我们变得不再孤独,因为网络就是一个新的客厅,我们时刻都可以进行沙龙活动。

非常乐意能与大家一起交流自己自学心得和发现,更希望大家能够对我学习过程中的错误给予指点——是的,这样我就能有许多免费的高师了——这也是分享时代,社区时代带来的好福利,我相信大家会的,是吧!

根据完全共享的精神,开源互助的理念,我的个人自学录制过程是全部按4K高清视频录制的,从手写笔记到验证手写笔记的上机操作过程全程录制,但因为4K高清文件太大均超过5G以上,所以无法上传至网络,如有需要可联系我QQ578652607对传,乐意分享。上传分享到百度网盘的只是压缩后的720P的视频。

我的学习过程录像百度盘地址分享如下:(清晰度:1280x720)

链接:https://pan.baidu.com/s/1EJUbOEtFOlqIj0IgyznD7g 

提取码:hyv0

Bilibili:

https://www.bilibili.com/video/av38091838/

喜马拉雅语音笔记:

https://www.ximalaya.com/keji/19103006/146513197


图片

图片

图片

图片

欢迎大家添加我为好友: QQ: 578652607
原文地址:https://www.cnblogs.com/lhghroom/p/10159064.html