SQLAlchemy基本操作

连接数据库

首先要创建engine,它代表一种数据库连接资源。可以通过engine船舰connect和session完成事务的提交。对于使用os.fork或者multiprocessing的多进程应用来说,通常需要为紫禁城提供单独的engine。

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:1@127.0.0.1/tomdb?charset=utf8")
# engine = create_engine("mysql+pymysql://root:1@127.0.0.1/tomdb",encoding='utf-8', echo=True)
#1 上面的create_engine就是用来连接数据库的引擎:
#2 mysql+pymysql指定使用pymysql来执行原生SQL语句
#3 //root:1@127.0.0.1/tomdb   <<==>> //用户名:密码@ip/数据库名
#4 encoding='utf-8' 指定创建的表用‘utf-8'编码(可以存中文)
#5 echo=True 将执行SQL原生语句的执行细节打印出来

创建表结构

'''第一步 建表:   创建表结构'''
Base = declarative_base()     #生成orm基类,执行SQL语句的类就继承Base

class User(Base):
    __tablename__ = 'user' #表名
    id = Column(Integer, primary_key=True)  #Column是导入的模块
    name = Column(String(32))                #String也是导入的模块
    password = Column(String(64))
    def __repr__(self):                    #如果想让它变的可读,只需在定义表的类下面加上这样的代码
        return "<id:%s name:%s password:%s>\n"%(self.id,self.name,self.password)
Base.metadata.create_all(engine)           #创建表结构

#1 Base是上面定义的orm父类,metadata.create_all是他的方法
#2 engine是连接数据库的引擎
#3 执行create_all(engine)将会执行所有继承Base的语句

创建会话

'''附加: 无论是增删改查都要先创建与数据库的会话session class'''
from sqlalchemy.orm import sessionmaker
#创建与数据库的会话session class ,注意,这里返回给session的是个class类,不是实例
Session_class = sessionmaker(bind=engine)       #创建用于数据库session的类
Session = Session_class()                       #这里才是生成session实例可以理解为cursor

插入数据

'''第二步 增1:  向表中添加单条数据'''
user_obj = User(name="tom",password="123456") #生成你要创建的数据对象,此时还没创建对象呢,不信你打印一下id发现还是None
Session.add(user_obj)                          #把要创建的数据对象(user_obj)添加到这个session里, 一会统一创建
print(user_obj.name,user_obj.id)               #此时也依然还没创建
Session.commit()                               #到此才统一提交,创建数据,但是为了演示后面内容可以放到最后面

'''第二步 增2:  向表中添加多条数据'''
user_obj1 = User(name='tom',password='123456')
user_obj2 = User(name='jack',password='123456')
Session.add_all([user_obj1,user_obj2])
Session.commit()

删除数据

#1、删除单条数据
Session.query(User).filter((User.id == 1)).delete()
Session.commit()

#2、删除多条数据
Session.query(User).filter((User.id.in_([4,5,6]))).delete(synchronize_session=False)
session.commit()

修改数据

# 先搜索出来,然后赋值就可以修改数据了    #<id: 2 name: tom password:123456>
data = Session.query(User).filter(User.id>1).filter(User.id<3).first()
data.name = 'new name'
data.password = '123456'
Session.commit()

简单查询

SQLAlchemy 在您的 Model 类上提供了 query 属性。当您访问它时,您会得到一个新的所有记录的查询对象。在使用 all() 或者 first() 发起查询之前可以使用方法 filter() 来过滤记录。如果您想要用主键查询的话,也可以使用 get()。

#1 打印user表中所有数据
ret = Session.query(User).all()     #user表中所有数据

#2 打印user表中所有name=jack的用户
ret = Session.query(User).filter_by(name='jack').all()

#3 打印user表中第一条name=jack的用户
ret = Session.query(User).filter_by(name='jack').first()     #user表中所有name=jack的数据

#4 单条件查询
data4 = Session.query(User).filter(User.id<100).all()
data5 = Session.query(User).filter(User.id==2).all()
data6 = Session.query(User).filter_by(id=2).all()

#5 filter多条件查询
data7 = Session.query(User).filter(User.id>1).filter(User.id<3).all()
ret = Session.query(User).filter(User.id > 1, User.name == 'jack').all()
ret = Session.query(User).filter(User.id.between(1, 3), User.name == 'jack').all()
ret = Session.query(User).filter(User.id.in_([3,4])).all()

from sqlalchemy import and_, or_
ret = Session.query(User).filter(and_(User.id > 3, User.name == 'jack')).all()
ret = Session.query(User).filter(or_(User.id < 2, User.name == 'jack')).all()

高级查询

'''第1步 查: 通配符 '''
ret1 = Session.query(User).filter(User.name.like('j%')).all()

'''第2步 查: 限制 '''
ret = Session.query(User)[0:3]        #这里过滤id但是从0开始计算[0:3]=id从1到4

'''第3步:    排序'''
ret = Session.query(User).order_by(User.id.desc()).all()
ret = Session.query(User).order_by( User.id.asc()).all()
ret = Session.query(User).order_by(User.name.desc(), User.id.asc()).all()

分组

ret = Session.query(User).group_by(User.name).all()      #有多个同名的只会打印id靠前的yige
ret = Session.query(User.name,func.count(User.name)).group_by(User.name).all()   #[('jack', 2), ('new name', 1), ('tom', 3)]
ret = Session.query(
    func.max(User.id),
    func.sum(User.id),
    func.min(User.id)).group_by(User.name).all()

回滚

事物就是有一系列动作一气呵成,如果中间失败了,则进行回滚,前面的动作不会生效。满足ACID特性。

最简单的例子就是转账,我给你转10块钱后台需要做两件事,先在我账户中减去10,再在你的账户里加10。想想如果这件事不用事务处理,我卡里减了10块钱,而转你钱没有成功,这十块钱就莫名消失了哈。

fake_user = User(name='Rain', password='12345') #创建一个用户
Session.add(fake_user)
Session.rollback() #此时你rollback一下
Session.commit()


发表评论