Python3 连接各类数据库
Python 数据库接口支持非常多的数据库:MySQL 、 PostgreSQL、Microsoft SQL Server 2000、 Informix 、Interbase、Oracle 、Sybase。通过python连接MySQL可以通过以下python库:
MySQLdb
MySQLdb 是用于Python链接Mysql数据库的接口,MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 最流行的一个驱动,很多框架也是依据其开发的。只支持python2.x。
Mysqlclient
完全兼容MySQLdb的衍生版;同时兼容Python3.x,原生SQL操作数据库。由于MySQLdb年久失修,后来出现了它的 Fork 版本 mysqlclient,完全兼容 MySQLdb
PyMysql
纯Python实现的驱动。速度不如MySQLdb,兼容MySQLdb,推荐使用PyMysql连接mysql
Python里封装的数据库操作很简单:
1、获取连接conn;
2、获取游标cursor;
3、使用cursor.execute()执行SQL语句;
4、使用cursor.rowcount返回执行insert,update,delete语句受影响的行数;
5、使用cursor.fetchall()获取查询的结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录;
6、关闭游标和连接。
如果SQL语句带有参数,那么需要把参数按照位置传递给cursor.execute()方法,有几个?占位符就必须对应几个参数,示例:
cursor.execute('select * from user where name=? ', ['abc'])
为了能在出错的情况下也关闭掉Connection对象和Cursor对象,建议实际项目里使用try:...except:...finally:...结构。
一、SQLite
SQLite是一种嵌入式数据库,SQLite本身是C写的体积很小,它的数据库就是一个文件,所以经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python内置了sqlite3。在Python中使用SQLite,不需要安装任何东西,直接使用。
在使用SQLite前先要搞清楚几个概念:表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,表和表之间通过外键关联。要操作关系数据库,首先需要连接到数据库,一个数据库连接称为Connection
;连接到数据库后,需要打开游标(Cursor)
,通过Cursor
执行SQL语句,然后获得执行结果。
import sqlite3 conn = sqlite3.connect('D:\\test.db') # 连接到SQLite数据库,数据库文件是test.db 如果文件不存在,会自动在当前目录创建 cursor = conn.cursor() # 创建一个Cursor # sqlite创建表时,若id为INTEGER类型且为主键,可以自动递增,在插入数据时id填NULL即可 # cursor.execute('create table user(id integer primary key, name varchar(25))') # 插入一条数据 cursor.execute('insert into user(id,name)values(NULL,"yjc")') conn.commit() #提交事务,否则上述SQL不会提交执行 # 执行查询 cursor.execute('select * from user') print(cursor.fetchall()) # 获取查询结果 [(1, 'yjc')] # 关闭游标和连接 cursor.close() conn.close()
二、Mysql
1. 安装 PyMysql 库
pip3 install pymysql
2. 连接数据库的几种方法
第一种:将各类字段写上
db = pymysql.connect(host="localhost", port=3306, user="root", passwd="root", db="Geek_Web", charset="utf8mb4")
第二种:省略字段
db = pymysql.connect(root,root, Geek_Web)
第三种:构建配置文件
config = {
'host':'localhost',
'port':3306,
'user':'root',
'passwd':'root',
'db':'Geek_Web',
'charset':'utf8mb4',
}
db = pymysql.connect(**config)
PyMysql 默认返回是元组, 在连接数据库时候加上 cursorclass=pymysql.cursors.DictCursor 就可以将数据库内容以字典格式返回
import pymysql # 连接数据库0 def Mysql_test0(): config = { 'host':'localhost', 'port':3306, 'user':'root', 'passwd':'lwwroot', 'db':'sakila', 'charset':'utf8mb4', 'cursorclass':pymysql.cursors.DictCursor #将数据库内容以字典格式返回,非必须参数 } db = pymysql.connect(**config) cursor = db.cursor() #获取操作游标 try: return (db, cursor) except: print("数据库访问失败") # 连接数据库1 def Mysql_test(): # 连接数据库,cursorclass=pymysql.cursors.DictCursor可以使数据库内容以字典格式返回,非必须参数 db = pymysql.connect(host="localhost", port=3306, user="root", passwd="lwwroot", db="test",cursorclass=pymysql.cursors.DictCursor, charset="utf8") #方法获取操作游标 cursor = db.cursor() try: return (db, cursor) except: print("数据库访问失败") db, cursor = Mysql_test() cursor.execute("SELECT * FROM city") #查询数据 print(cursor.fetchall()) # cursor.execute("insert into city(ID, Name, CountryCode, Population) values (1002, 'shanghai', 'CN', 4000000)") #插入数据 # db.commit() # cursor.execute("update city set ID=1003 where name='beijing'") #修改数据 # db.commit() # cursor.execute("delete from city where name='shanghai'") #删除数据 # db.commit() cursor.close() db.close()
三、Mssql
1. 安装 PyMssql 库
pip3 install pymssql
2. 连接数据库的方法
Mssql 用字典配置不可以用,connect() 用来连接数据库
db = pymssql.connect(host="192.0.0.200",user="ymyg",password="ymyg",database="Geek_Web")
3. 操作数据库
和 Mysql 操作方法一模一样,只不过将 PyMysql 改为 PyMssql 即可,参考上面 PyMssql
4. PyMssql 返回字典数据
只需要在连接数据库时候加上一个 as_dict 字段,将值改为 True 即可
db = pymssql.connect(host="192.0.0.200",user="ymyg",password="ymyg",database="Geek_Web",as_dict=True)
5. PyMssql 参数
connect() 参数
- dsn 连接字符串 主要用于与之前版本的pymssql兼容
- user 用户名
- password 密码
- trusted 布尔值 指定是否使用windows身份认证登陆
- host 主机名
- database 数据库
- timeout 查询超时
- login_timeout 登陆超时
- charset 数据库的字符集
- as_dict 布尔值 指定返回值是字典还是元组
- max_conn 最大连接数
操作方法
- close() 关闭游标
- execute(operation) 执行操作
- execute(operation params) 执行操作 可以提供参数进行相应操作
- executemany(operation paramsseq) 执行操作 Paramsseq 为元组
- fetchone() 在结果中读取下一行
- fetchmany(size=None) 在结果中读取指定数目的行
- fetchall() 读取所有行
- nextset() 游标跳转到下一个数据集
其他方法
- autocommit(status) 布尔值 指示是否自动提交事务 默认的状态是关闭的 如果打开 你必须调用commit()方法来提交事务
- close() 关闭连接
- cursor() 返回游标对象 用于查询和返回数据
- commit() 提交事务
- rollback() 回滚事务
- pymssqlCursor类 用于从数据库查询和返回数据
- rowcount 返回最后操作影响的行数
- connection 返回创建游标的连接对象
- lastrowid 返回插入的最后一行
- rownumber 返回当前数据集中的游标(通过索引)
import time import pymssql class MSSQL: def __init__(self,host,user,pwd,db): self.host=host self.user=user self.pwd=pwd self.db=db def GetConnect(self): if not self.db: raise(NameError,'没有目标数据库') self.connect=pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset='utf8') cur=self.connect.cursor() if not cur: raise(NameError,'数据库访问失败') else: return cur def ExecSql(self,sql): cur=self.GetConnect() cur.execute(sql) self.connect.commit() self.connect.close() def ExecQuery(self,sql): cur=self.GetConnect() cur.execute(sql) resList = cur.fetchall() self.connect.close() return resList def main(): ms = MSSQL(host="192.168.0.108", user="sa", pwd="sa", db="ComPrject") resList = ms.ExecQuery("select *from TestModel") print(resList) if __name__ == '__main__': main() print("执行完成")
四、Oracle
1. 安装 cx_Oracle 库
pip3 install cx_Oracle
2.Oracle instant client 下载安装
下载地址http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html。然后解压下载的压缩包,并将对应的解压位置加入系统变量Path中,将Oracle instant client目录下的oraocci12.dll、oraociei12.dll、oci.dll复制到python安装目
3. 连接数据库的几种方法
第一种:Oracle 连接方法
db = cx_Oracle.connect('root/root@localhost: 1523/orcl')
第二种:省略字段连接方法
db = cx_Oracle.connect('root', 'root', 'localhost: 1523/orcl')
第三种:dsn 方法
makedsn(IP/HOST, PORT, TNSNAME)
dsn = cx_Oracle.makedsn('localhost','1523','orcl')
db = cx_Oracle.connect('root','root',dsn)
4. 操作数据库
和 Mysql 操作方法一模一样,只不过将 PyMysql 改为 cx_Oracle 即可
import cx_Oracle #连接数据库,下面括号里内容根据自己实际情况填写 conn = cx_Oracle.connect('用户名/密码@IP:端口号/SERVICE_NAME') # 使用cursor()方法获取操作游标 cursor = conn.cursor() #使用execute方法执行SQL语句 result=cursor.execute('Select member_id from member') #获取所有数据 all_data=cursor.fetchall() #使用fetchone()方法获取一条数据 #data=cursor.fetchone() #获取部分数据,8条 #many_data=cursor.fetchmany(8) print (all_data) db.close()