day38
内容回顾
面向对象
-
提取共性
-
分类
-
模板“约束”
-
当一类函数公用同样参数时候,可以转变成类进行—分类
-
区别:
-
面向对象:数据和逻辑(属性和行为)组合在一起
-
函数编程:数据和逻辑分离
-
-
特殊方法:
class Foo:
def __init__(self,name):
self.name = name
def show(self):
print(self.name)
def __call__(self):
pass
def __getitem__(self,key):
pass
def __setitem__(self,key,value):
pass
def __delitem__(self,key):
pass
obj = Foo("eric")
obj()
obj["k"]
obj["k"]=1243
del obj[k]
obj.__dict__
pymysql
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
# 创建连接
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
# 创建游标
cursor = conn.cursor()
# 执行SQL,并返回收影响行数
effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
# 提交,不然无法保存新建或者修改的数据
conn.commit()
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
# 获取最新自增ID
new_id = cursor.lastrowid
注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:
?
cursor.scroll(1,mode='relative') # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动
今日内容
1.ORM框架:SQLAlchemy
-
pip3 install SQLAlchemy
-
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:
-
作用:
-
提供简单的规则
-
自动转换成sql语句
-
1.2两类ORM框架
-
DB first
-
手动创建数据库以及表然后ORM框架和自动生成类
-
-
code first
-
手动创建类和数据库然后ORM框架和自动生成表
-
1.3功能
-
创建数据库表
-
连接数据库(非做的SQLAlchemy,是做的pymysql,mysqldb,)
-
类转换成sql语句
-
-
工作流程
-
SQLAlchemy ORM
-
Object Relatlonal Mapper(ORM) #可以看作类
-
类和2.1,2.2配合起来将其转换为sql语句
-
-
SQLAlchemy Core
-
Schema/types
-
SQL Expression Language
-
Engine #引擎(配置文件会给引擎)
-
Connection Pooling #连接池(保持多少个连接)
-
Diaiect #选择(选择你要连接pymysql,mysqldb......)
-
-
-
DBAPI 代指连接(pymysql,mysqlDB,SQL,Oracle...)
-
-
增(做操作的代表行)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
?
class UserType(Base):
__tablename__="usertype"
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(32),nullable=True,index=True)
?
engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5) #连接mysql数据库
Session = sessionmaker(bind=engine) #获取权限
session=Session() #获取权限
#单个添加
obj1=UserType(title="普通用户") #在title中添加“普通用户”这个值
session.add(obj1) #将其写入
#多个添加
objs =[
UserType(title="超级用户")
UserType(title="白金用户")
UserType(title="黑金用户")
]
session.add_all(objs)
session.commit() #提交
session.close() #关闭 -
删
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
?
class UserType(Base):
__tablename__="usertype"
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(32),nullable=True,index=True)
?
engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5) #连接mysql数据库
Session = sessionmaker(bind=engine) #获取权限
session=Session() #获取权限
user_type_list = session.query(UserType).filter(UserType.id>2).delete() #查到满足条件的并删除
#.delete() #删除
session.commit() #提交
session.close() #关闭 -
改
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
?
?
class UserType(Base):
__tablename__="usertype"
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(32),nullable=True,index=True)
?
engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5) #连接mysql数据库
Session = sessionmaker(bind=engine) #获取权限
session=Session() #获取权限
user_type_list = session.query(UserType).filter(UserType.id>0).update({title:"黑金"}) #查到小于0的id并把title修改为“黑金”
session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False) #字符串做操作时
session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate") ##数值做操作时
#synchronize_session=False 如果要对字符串操作时必须加、
#synchronize_session="evaluate" 对数值做操作是必须加
session.commit() #提交
session.close() #关闭 -
查
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine
?
?
class UserType(Base):
__tablename__="usertype"
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(32),nullable=True,index=True)
?
engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/s4day62db?charset=utf8",max_overflow=5) #连接mysql数据库
Session = sessionmaker(bind=engine) #获取权限
session=Session() #获取权限
user_type_list = session.query(UserType(你想取那几列可以写在这如:UserType.id"只写表名相当于sql中的*号")).all() #查询usertype表中的所有记录
#.all() 是全部
#.filter(UserType.id>2) 是过滤和sql中的where一样
print(session.query(UserType)) #可以看到sql代码
for row in user_type_list:
print(row.id,row.title)
?
session.commit() #提交
session.close() #关闭 -
其他
#条件
ret = session.query(user).filtr_by(name="alex").all()
ret = session.query(user).filter(user.id>1,user.name == "eric").all()#逗号分隔开默认是and运算
ret = session.query(user).filter(user.id.between(1,3),user.name == "eric").all()
#.between(1,3)
ret=session.query(user).filter(user.id.in_([1,3,4])).all() #in_([1,2,3])就代表in
ret=session.query(user).filter(~user.id.in_([1,3,4])).all() #~就代表not
ret = session.query(user).filter(user.id.in_(session.query(user.id).filter_by(name="eric"))).all()#写表达式用filter如果是参数就用filter_by,filter_by在内部就调用的是filter,拿到的是字典在内部会被转成表达式来引用
from sqlalcheny import and_,or_#如果要用and和or需要导入一下
ret = session.query(user).filter(and_(user.id>3,user.name == "eric")).all()
ret = session.query(user).filter(or_(user.id>3,user.name == "eric")).all()#用什么定义就用什么运算
ret = session.query(user).filter(or_(user.id<2),and_(user.name == "eric",user.id>3)).all()
#通配符
ret = session.query(user).filter(user.naem.like("e%")).all()#找到所有e开头的用户
ret = session.query(user).filter(~user.naem.like("e%")).all()#找到所有不是e开头的用户
#限制
ret = session.query(user)[1:2]#这样写是切片
#排序
ret = session.query(user).order_by(user.name.desc()).all()
ret = session.query(user).order_by(user.naem.desc(),user.id.asc()).all()
#如果姓名出现了重复就用id排序
#分组
from sqlalchemy.sql import func #用之前需要导入一下
ret = session.query(user).qroup_by(user.extre).all()
ret = session.query(
func.max(user.id),
func.sum(user.id),