SQLite是一种嵌入式数据库,SQLite本身是C写的体积很小,它的数据库就是一个文件,所以经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python内置了sqlite3。 #coding:utf-8import sqlite3conn = sqlite3.connect('test.db')cursor = conn.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')')# 返回影响的行数print(cursor.rowcount)#提交事务,否则上述SQL不会提交执行conn.commit()# 执行查询cursor.execute('select * from user')# 获取查询结果print(cursor.fetchall())# 关闭游标和连接cursor.close()conn.close() 输出:
我们发现Python里封装的数据库操作很简单: 如果SQL语句带有参数,那么需要把参数按照位置传递给cursor.execute()方法,有几个?占位符就必须对应几个参数,示例: cursor.execute('select * from user where name=? ', ['abc']) 二、Mysql db = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='Geek_Web', charset='utf8mb4') db = pymysql.connect(root,root, Geek_Web) config = { # 在连接数据库时候加上 cursorclass 就可以数据库内容以字典格式返回 #!/usr/bin/env python3# -*- coding: UTF-8 -*-# 安装PyMySQL# sudo pip install PyMySQLimport pymysqlconfig = {'host':'localhost','port':3306,'user':'root','passwd':'root','db':'Geek_Web','charset':'utf8mb4',# 数据库内容以字典格式输出#'cursorclass':pymysql.cursors.DictCursor,}# 连接数据库def Mysql():# 连接数据库#db = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='Geek_Web', charset='utf8mb4')db = pymysql.connect(**config)#cursor()方法获取操作游标 cursor = db.cursor()try:return (db, cursor)except:print('数据库访问失败')# 增def Insert(db, cursor):sql = 'insert into main(id, Tag, Name, Version, Introduce, Class, Worked_OS, Course_URL, Download_URL, Image_URL, Remarks_1, Remarks_2) \values (NULL, '软件编号', '软件名称', '软件版本', '软件简介', '软件类别', '运行环境', '教程地址', '下载地址', '图标地址', '备注1', '备注2')'# 执行SQL语句cursor.execute(sql)# 没有设置默认自动提交,需要主动提交,以保存所执行的语句db.commit()# 删def Delect(db, cursor):sql = 'DELETE FROM main WHERE Name = '修改后的名字''cursor.execute(sql)db.commit()# 查def Select(db, cursor):sql = 'SELECT * FROM main'cursor.execute(sql)# 获取所有记录列表results = cursor.fetchall()return results# 改def Update(db, cursor):sql = 'UPDATE main SET Name = '修改后的名字' WHERE Remarks_2 = '备注2''cursor.execute(sql)db.commit()# 关闭数据库连接def Close(db, cursor):cursor.close()db.close()(db, cursor) = Mysql()print('\n-------------数据库初始状态-------------')print(Select(db, cursor))Insert(db, cursor)print('\n-------------数据库插入数据-------------')print(Select(db, cursor))Update(db, cursor)print('\n-------------数据库修改数据-------------')print(Select(db, cursor))Delect(db, cursor)print('\n-------------数据库删除数据-------------')print(Select(db, cursor))Close(db, cursor) 6. pymysql使用: from pymsql import * 导入模块 (db = pymysql.connect(...)) 1、建立数据库连接 c = db.cursor()) 2、创建游标对象 c.execute('insert ....') 3、游标方法: db.commit() 4、提交到数据库 c.close() 5、关闭游标对象 db.close() 6、断开数据库连接 : connect对象: db = pymysql.connect(参数列表) 1、host :主机地址,本地 localhost 2、port :端口号,默认3306 3、user :用户名 4、password :密码 5、database :库 6、charset :编码方式,推荐使用 utf8 连接对象的方法: 数据库连接对象(db)的方法 1、db.close() 关闭连接 2、db.commit() 提交到数据库执行 3、db.rollback() 回滚 4、cur = db.cursor() 返回游标对象,用于执行具体SQL命令 游标对象的方法: 游标对象(cur)的方法 1、cur.execute(sql命令,[列表]) 执行SQL命令 2、cur.close() 关闭游标对象 3、cur.fetchone() 获取查询结果集的第一条数据 4、cur.fetchmany(n) 获取n条 5、cur.fetchall() 获取所有记录 三、Mssql db = pymssql.connect(host='192.0.0.200',user='ymyg',password='ymyg',database='Geek_Web') 4. PyMssql 返回字典数据 db = pymssql.connect(host='192.0.0.200',user='ymyg',password='ymyg',database='Geek_Web',as_dict=True) 5.连接示例 import timeimport pymssql#import decimalclass 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() input('执行完成:') 5. PyMssql 参数 connect() 参数
操作方法
其他方法
四、Oracle 连接Oracle比MySQL麻烦一些,连接Oracle需要安装cx_Oracle和oracle客户端 1. 安装 cx_Oracle 库 2. Oracle instant client 下载安装 3. 连接数据库的几种方法 db = cx_Oracle.connect('root/root@localhost: 1523/orcl') db = cx_Oracle.connect('root', 'root', 'localhost: 1523/orcl') makedsn(IP/HOST, PORT, TNSNAME) 5. PyMssql 返回字典数据 cx_Oracle 的 Cursor 对象有一个属性 rowfactory 是是用来自定义查询结果的预处理方法的,定义一个闭包 def makedict(cursor): 6.连接示例 import cx_Oracle#连接数据库,下面括号里内容根据自己实际情况填写conn = cx_Oracle.connect('用户名/密码@IP:端口号/SERVICE_NAME')# 使用cursor()方法获取操作游标cursor = conn.cursor()#使用execute方法执行SQL语句result=cursor.execute('Select member_id from member')#使用fetchone()方法获取一条数据#data=cursor.fetchone() #获取所有数据all_data=cursor.fetchall() #获取部分数据,8条#many_data=cursor.fetchmany(8)print (all_data)db.close() # -*- coding: UTF-8 -*-import cx_Oracle as oracleimport sysimport osimport iosys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'class ExportOracle: def __init__(self,odbc,user): self.odbc = odbc self.user = user def start(self): db = oracle.connect(self.odbc) cursor = db.cursor() cursor.execute('SELECT NAME,AGE FROM USERS ') datas = cursor.fetchall() print(datas) if __name__ == '__main__': orcleDb_config = { 'odbc':'TEST_XIAOYI/TEST_XIAOYI@192.168.1.1:1521/orcl', 'user': 'TEST_XIAOYI', } mtables = ExportOracle(orcleDb_config['odbc'],orcleDb_config['user']); mtables.start(); 五、ORM ORM将数据库中的表与面向对象语言中的类建立了一种映射关系,ORM可以说是参照映射来处理数据的模型,比如说:需要创建一个表,可以定义一个类,而这个类存在与表相映射的属性,那么可以通过操作这个类来创建一个表,写原生 SQL 的过程非常繁琐,代码重复,有了 ORM 你不再需要写 SQL 语句。ORM兼容多种数据库系统,如sqlite, mysql、postgresql。 Peewee SQLAlchemy 六、Peewee Peewee中 ![]() 也就是说,一个Model类代表一个数据库的表,一个Field字段代表数据库中的一个字段,而一个model类实例化对象则代表数据库中的一行。 定义Model,建立数据库在使用的时候,根据需求先定义好Model,然后可以通过create_tables()创建表,若是已经创建好数据库表了,可以通过python -m pwiz脚本工具直接创建Model。 第一种方式:先定义Model,然后通过db.create_tables()创建或Model.create_table()创建表。 from peewee import *# 连接数据库database = MySQLDatabase('test', user='root', host='localhost', port=3306)# 定义Personclass Person(Model): name = CharField() birthday = DateField() is_relative = BooleanField() class Meta: database = database 然后,我们就可以创建表了
其中,CharField、DateField、BooleanField等这些类型与数据库中的数据类型一一对应,我们直接使用它就行,至于CharField => varchar(255)这种转换Peewee已经为我们做好了 。 第二种方式:已经存在过数据库,则直接通过python -m pwiz批量创建Model。 # 指定mysql,用户为root,host为localhost,数据库为testpython -m pwiz -e mysql -u root -H localhost --password test > testModel.py 然后,输入密码,pwiz脚本会自动创建Model,内容如下:
操作数据库操作数据库,就是增、删、改和查。 1、增直接创建示例,然后使用save()就添加了一条新数据 # 添加一条数据p = Person(name='liuchungui', birthday=date(1990, 12, 20), is_relative=True)p.save() 2、删使用delete().where().execute()进行删除,where()是条件,execute()负责执行语句。若是已经查询出来的实例,则直接使用delete_instance()删除。
3、改若是,已经添加过数据的的实例或查询到的数据实例,且表拥有 # 已经实例化的数据,指定了id这个primary key,则此时保存就是更新数据p = Person(name='liuchungui', birthday=date(1990, 12, 20), is_relative=False)p.id = 1p.save()# 更新birthday数据q = Person.update({Person.birthday: date(1983, 12, 21)}).where(Person.name == 'liuchungui')q.execute() 4、查单条数据使用Person.get()就行了,也可以使用Person.select().where().get()。 若是查询多条数据,则使用Person.select().where(),去掉get()就行了。语法很直观,select()就是查询,where是条件,get是获取第一条数据。
七、SQLAlchemy 使用 sqlalchemy 有3种方式: 通过 engine = create_engine('dialect+driver://username:password@host:port/database')初始化连接
例如 常用的数据库连接字符串 # postgresql # mysql # oracle sqlalchemy访问数据库的示例 from sqlalchemy import Column, String, create_enginefrom sqlalchemy.orm import sessionmakerfrom sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): # 表的名字 __tablename__ = 'user' # 表的结构 id = Column(String(20), primary_key=True) name = Column(String(20)) # 初始化数据库连接engine = create_engine('mysql+mysqlconnector://root:111111@localhost:3306/test')# 创建DBSession类型DBSession = sessionmaker(bind=engine)# create_engine用来初始化数据库连接.# SQLAlchemy用一个字符串表示连接信息'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名' # # 创建session对象:# session = DBSession()# # 创建新User对象# new_user = User(id='5', name='Bob')# # 添加到session# session.add(new_user)# # 提交保存到数据库# session.commit()# # 关闭session# session.close() # 可见将关键是获取session, 然后把对象添加到session, 最后提交并关闭.(DBSession对象, 可以看做是当前数据库的连接) # 查询session = DBSession()# 创建Query查询, filter是where条件, 最后调用one()返回唯一行, 如果调用all()则返回所有行.user = session.query(User).filter(User.id=='5').one()print('type:', type(user))print('name:', user.name)session.close() # ORM就是把数据库表的行与相应的对象简历关联, 互相转换.# 由于关系数据库的多个表还可以用外键实现一对多, 多对多的关联, 相应地, ORM框架也可以提供两个对象之间的一对多, 多对多功能. 1、连接数据库在sqlalchemy中,session用于创建程序与数据库之间的会话。所有对象的载入和保存都需要通过session对象。from sqlalchemy import create_enginefrom sqlalchemy.orm import sessionmaker# 链接数据库采用pymysq模块做映射,后面参数是最大连接数5ENGINE=create_engine('mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8', max_overflow=5)Session = sessionmaker(bind=engine)session = Session()2、创建映射(创建表)一个映射对应着一个Python类,用来表示一个表的结构。下面创建一个person表,包括id和name两个字段。也就是说创建表就是用python的的类来实现import sqlalchemyfrom sqlalchemy import create_enginefrom sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, Stringfrom sqlalchemy.orm import sessionmakerENGINE=create_engine('mysql+pymysql://root@127.0.0.1:3306/digchouti?charset=utf8', max_overflow=5)#生成一个SQLORM基类,创建表必须继承他,别问我啥意思就是这么规定的Base = declarative_base()class Person(Base): __tablename__ = 'userinfo' id = Column(Integer, primary_key=True) name = Column(String(32)) def __repr__(self): return '<Person(name='%s')>' % self.name此代码是创建了一个名字叫userinfo的表,表里有两列,一列是id,一列是name。3、添加数据当然我们创建了表,肯定也要添加数据,代码如下:#创建一个person对象person = Person(name='张三')#添加person对象,但是仍然没有提交到数据库session.add(person)#提交数据库session.commit()当然还能添加多条数据:session.add_all([ Person(name='张三'), Person(name='aylin')])session.commit() |
|