一、使用pymysql
pymasql:是一个第三方模块,并且要求python版本为3.4以上。
在python2中使用的是mysqldb。
安装
在命令行中执行
pip install pymysql
使用
1.连接数据库
2.创建游标
3.定义sql语句
4.执行sql语句
5.关闭连接
获取返回内容
1.fetchone():函数,获取返回的一条数据
2.fetchall():函数,获取返回的全部数据
3.rowcount:属性,获取操作影响的行数
实例
import pymysql
# 1.连接数据库
# 数据默认返回的数据结果是元组类型,不易于操作
# 加上参数cursorclass=pymysql.cursors.DictCursor,fetchone()结果为字典,fetchall()结果为列表内嵌字典
db=pymysql.connect(host='localhost', user='root', password="181818",database='demo',cursorclass=pymysql.cursors.DictCursor)
# 2.创建游标对象
cursor=db.cursor()
# 3.定义sql语句
# 版本号
# sql='select version()'
# 查询
sql='select *from user'
# 添加
# sql='insert into user(id,name) values(25,"明明")'
# 更新
# sql='update user set id=5 where name="明明"'
# 4.执行sql语句
cursor.execute(sql)
# 获取返回结果
print(cursor.fetchone()) # 一次获取一行
print(cursor.fetchone())
print(cursor.fetchall()) # 一次获取余下所有行
print(cursor.rowcount) # 获取操作影响的行数
# 如果操作对数据库中的操作产生影响(增删改),必须提交,否则将不会生效
db.commit()
# 5.断开连接
cursor.close()
db.close()
封装及使用
封装类
mysql.py
import pymysql
class MyDB:
def __init__(self,p,db,h='localhost',u='root'):
# 连接数据库,创建游标对象
self.db=pymysql.connect(host=h, user=u, password=p,database=db,cursorclass=pymysql.cursors.DictCursor)
self.cursor=self.db.cursor()
# 查询
def query(self,sql):
self.cursor.execute(sql)
return self.cursor.fetchall()
# 增删改
def change(self,sql):
self.cursor.execute(sql)
self.db.commit()
return self.cursor.rowcount
def __del__(self):
# 关闭数据库连接
self.cursor.close()
self.db.close()
if __name__ == '__main__': # 一般用于测试
database = MyDB('181818','demo')
print(database.query('select * from user'))
使用
mydb_demo.py
from mydb import MyDB
# 实例化数据库对象
database=MyDB('181818','demo')
sql='insert into user values(7,"小茜")'
print(database.change(sql))
sql='select * from user'
print(database.query(sql))
二、使用ORM
ORM,全称Object Relational Mapping,意为对象关系映射。
ORM是一个操作数据库的框架
ORM会将python代码翻译成对应数据库的sql语句
ORM会将数据库中的表,映射成python中的类
一张表就是一个类,将表中的字段映射成对象的属性。
优:所以我们在使用ORM时,可以不关心用的是什么数据库,只专心关心业务逻辑。即使开发人员不会sql语句,也能与数据库进行交互。
缺:ORM生成的sql语句,不是最优的sql语句,执行效率会比较低。
python中有一个ORM,即sqlalchemy。
仿照的是Django框架的ORM。
flask中有一个ORM插件:flask-sqlalchemy。
安装
在命令行执行
pip install sqlalchemy
使用
1.导包
2.创建连接
3.声明一个基类
4.创建类–数据模型
5.操作
!!注意:重复执行py文件时,不会重复建表。
实例
创建表
import sqlalchemy
# 1.导包
from sqlalchemy.ext.declarative import declarative_base
# 类似于pymysql中的游标
from sqlalchemy.orm import sessionmaker
# 2.创建连接
# 数据库类型+数据库操作的包://用户名:密码@IP地址/数据库
# 有mysqlclient包时,mysql+pymysql可改为mysql
db=sqlalchemy.create_engine('mysql://root:181818@localhost/sqlorm')
# 3.创建基类
base=declarative_base(db)
# 4.创建表--数据模型
class User(base):
# 表名
__tablename__='user'
# 字段
id=sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
name=sqlalchemy.Column(sqlalchemy.String(32))
age=sqlalchemy.Column(sqlalchemy.Integer)
class Userinfo(base):
__tablename__='userinfo'
id=sqlalchemy.Column(sqlalchemy.Integer,primary_key=True)
phone = sqlalchemy.Column(sqlalchemy.String(20))
if __name__ == '__main__':
# 执行数据库迁移(创建表)
base.metadata.create_all(db)
对表进行操作
if __name__ == '__main__':
# 执行数据库迁移(创建表)
base.metadata.create_all(db)
# 绑定一个session实例
s=sessionmaker(bind=db)
# 创建一个会话对象,类似于游标
session=s()
# 数据库操作
# 添加
# 单条插入
# user=User(name='hello',age=16)
# session.add(user)
# session.commit()
# 多条插入
# session.add_all([
# User(name='world', age=20),
# User(name='python', age=28),
# User(name='PHP', age=34)
# ])
# session.commit()
# 查询
# 查询所有的数据,返回一个存放对象的列表
# res = session.query(User).all()
# for x in res:
# print(x.name,x.age)
# 通过主键值查询一条数据,返回一个对象
# res=session.query(User).get(10)
# print(res.name,res.age)
# 条件查询,返回的是一个存放对象的列表
# res = session.query(User).filter_by(name='python').all()
# for x in res:
# print(x.name,x.age)
# 修改
# res=session.query(User).get(1)
# res.name='hhh'
# session.commit()
# 删除
res = session.query(User).get(1)
session.delete(res)
session.commit()
添加
单行插入
user=User(name='hello',age=16)
session.add(user)
session.commit()
多行插入
session.add_all([
User(name='world', age=20),
User(name='python', age=28),
User(name='PHP', age=34)
])
session.commit()
查询
查询中的all(),还可以为first(),取符合条件的第一条数据。结果会从原来的存放对象的列表,变为一个单独的对象。
修改
res=session.query(User).get(1)
res.name='hhh'
session.commit()
删除
res = session.query(User).get(1)
session.delete(res)
session.commit()
三、区别