sqlachemy orm框架学习:
sqlachemy是python语言中用于开发orm框架的库。它的底层是基于MySQL,pymysql等的封装。
part one:生成表结构:
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String
engine =create_engine('mysql+pymysql://root:123456@localhost/oldboydb',encoding='utf-8',echo=True)
#create_engine:连接数据库(相当于声明一个socket连接实例)
# sqlalchemy底层是基于mysql、pymysql等的封装,支持MySQL等包
#选择用什么底层(mysql+pymysql);用户名:密码;主机;数据库;字符集;
#echo=True:打印所有信息
Base =declarative_base() #declarative_base():生成orm基类(内置类)
class User(Base): #定义实体类(声明表结构);User(子类)继承了Base(父类)
__tablename__='test' #表名
id =Column(Integer,primary_key=True) #字段id:整形,主键 Column是sqlalchemy的方法
# age =Column(String(32)) #字段age
name =Column(String(32)) #字段name
password =Column(String(64)) #字段password
def __repr__(self): #调用该实体类时,定义返回值为....
return '%s name:%s'%(self.id,self.name)
Base.metadata.create_all(engine)
#orm基类.metadata.create_all:创建表结构(所有被继承对象(父类调子类));engine:socket连接实例;
不同于pymysql(生成cursor游标后即可调用原生sql指令),sqlachemy是通过sessionmaker方法生成实例对象,再去调用其内置方法。所以一旦框架搭建完成,效率应该是大幅提升的。 part two:生成实例对象,添加属性
from sqlalchemy.orm import sessionmaker #sessionmaker:内置很多方法
Session_class =sessionmaker(bind =engine)
#bind:绑定连接实例对象engine(注:此时Session_class是一个类,而不是实例对象(不同于cursor方法,直接生成实例对象)
Session =Session_class() #调用类生成实例对象(相当于cursor =connection.cursor())
user_obj1 =User(name ='clex',age=127889,password ='alex123') #生成实体对象
Session.add(user_obj1) #添加实体对象至表格
print(user_obj1.name,user_obj1.age,user_obj1.password)
Session.commit()
##上传保存(注:此part自动开启事务,不保存则丢失)
#pymysql的.commit()也通过实例对象调用,而不是通过生成的游标实例调用。这与sqlalchemy相似又不相似。
part three:增删改查
#session.query(Models1, Models2,...):查询的实体类(表); 返回值为列表
#filter_by与filter_by:限定条件不同
data =Session.query(User).filter_by(name='alex').first()
#query().filter_by:限定查询(通过等值限定);first()/all():查询范围
data =Session.query(User).filter(User.id>2).filter(User.id<7).all() #query().filter:限定查询(通过条件限定,可多重),first()/all():限定范围
print(Session.query(User).filter_by(name='alex').all())
print(data[0].name,data[0].password) #data为列表
print('--------------------------------------')
print(Session.query(User).filter(User.name.in_(['alex','blex','clex'])).count()) #.in_():按字头查询;.count():计数,统计
data[0].name='jim' #通过列表下标索引可直接修改
data[0].password='j123'
print(data[1].name,data[0].password)
print(data[4].name,data[0].password)
print(data[20].name,data[0].password) #超出索引值报错
Session.commit() #上传保存(自动开启事务,不保存则丢失)