连接数据库
首先要创建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()
转载请注明:www.ainoob.cn » SQLAlchemy基本操作