flask-SQLAlchemy的ORM
1.创建表
import datetime
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index
from sqlalchemy.orm import relationship, sessionmaker Base = declarative_base() # 一对多
class Users(Base):
__tablename__ = 'users' id = Column(Integer, primary_key=True)
name = Column(String(32), index=True, nullable=False)
email = Column(String(32), unique=True)
ctime = Column(DateTime, default=datetime.datetime.now) # 传递函数
extra = Column(Text, nullable=True) # 联级删除
groupId = Column(Integer, ForeignKey("usergroup.id", ondelete='CASCADE'))
userGroup = relationship("UserGroup", backref="gusers") __table_args__ = {
# 字符编码
'mysql_charset': 'utf8'
# 引擎
# UniqueConstraint('id', 'name', name='uix_id_name'),
# Index('ix_id_name', 'name', 'email'),
}
class UserGroup(Base):
__tablename__ = 'usergroup'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False) # 多对多
class Grade(Base):
__tablename__ = 'grade'
id = Column(Integer, primary_key=True, autoincrement=True)
score = Column(Integer, default=0) # 联级删除,一般不会直接删除关联表,而是将state设置为0
student_id = Column(Integer, ForeignKey('student.id', ondelete='CASCADE'))
course_id = Column(Integer, ForeignKey('course.id', ondelete='CASCADE')) class Student(Base):
__tablename__ = 'student'
id = Column(Integer, primary_key=True)
name = Column(String(64), nullable=False)
# age = Column(Integer) # 与生成表结构无关,仅用于查询方便
courses = relationship('Course', secondary='grade', backref='students') class Course(Base):
__tablename__ = 'course' id = Column(Integer, primary_key=True, autoincrement=True)
course_name = Column(String(64), nullable=False) def init_db():
engine = create_engine(
"mysql+cymysql://root:123@127.0.0.1:3306/sqlalchemy1?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
)
Base.metadata.create_all(engine) def del_db():
"""
根据类删除数据库表
:return:
"""
engine = create_engine(
"mysql+cymysql://root:123@127.0.0.1:3306/sqlalchemy1?charset=utf8",
max_overflow=0, # 超过连接池大小外最多创建的连接
pool_size=5, # 连接池大小
pool_timeout=30, # 池中没有线程最多等待的时间,否则报错
pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置)
) Base.metadata.drop_all(engine) def init_data1():
engine = create_engine("mysql+cymysql://root:123@127.0.0.1:3306/sqlalchemy1?charset=utf8", max_overflow=0,
pool_size=5)
Session = sessionmaker(bind=engine) session = Session()
# 方式一
# session.add_all([UserGroup(name='用户组1'), UserGroup(name='用户组2')])
# session.add_all([Users(name='admin', email='666@qq.com', extra='简介', groupId=1),
# Users(name='admin', email='888@qq.com', extra='简介2', groupId=2),])
# 方式二
g1 = UserGroup(name='用户组3')
g1.gusers = [Users(name='admin', email='777@qq.com', extra='简介', groupId=1)]
session.add(g1)
g2 = UserGroup(name='用户组4')
g2.gusers = [Users(name='admin', email='999@qq.com', extra='简介2', groupId=2)]
session.add(g2) session.commit()
session.close() def init_data2():
engine = create_engine("mysql+cymysql://root:123@127.0.0.1:3306/sqlalchemy1?charset=utf8", max_overflow=0,
pool_size=5)
Session = sessionmaker(bind=engine) session = Session()
# 方式一
# session.add_all([Student(name='张三'), Student(name='李四'), ])
# session.add_all([Course(course_name='java'), Course(course_name='python'), ])
#
# session.commit() # 这里必须先提交
#
# session.add_all([Grade(student_id=1, course_id=1),
# Grade(student_id=1, course_id=2),
# Grade(student_id=2, course_id=1), ]) # 方式二
# 自动插入Grade数据,仅仅插入id
stu1 = Student(name='张三')
stu1.courses = [Course(course_name='java'), Course(course_name='python'), ]
session.add(stu1) session.commit()
session.close()
ORM
2.增删改查
# ################ 添加 ################
"""
obj1 = Users(name="wupeiqi")
session.add(obj1) session.add_all([
Users(name="wupeiqi"),
Users(name="alex"),
Hosts(name="c1.com"),
])
session.commit()
""" # ################ 删除 ################
"""
session.query(Users).filter(Users.id > 2).delete()
session.commit()
"""
# ################ 修改 ################
"""
session.query(Users).filter(Users.id > 0).update({"name" : "099"})
session.query(Users).filter(Users.id > 0).update({Users.name: Users.name + "099"}, synchronize_session=False)
session.query(Users).filter(Users.id > 0).update({"age": Users.age + 1}, synchronize_session="evaluate")
session.commit()
"""
# ################ 查询 ################
filter:表达式
filter_by:参数
动态参数:text(id<:value and name=:name)
执行原生SQL:session.query(Users).from_statement(text("select * from users where id=:value")).params(name='')
"""
r1 = session.query(Users).all()
r2 = session.query(Users.name.label('xx'), Users.age).all()
r3 = session.query(Users).filter(Users.name == "alex").all()
r4 = session.query(Users).filter_by(name='alex').all()
r5 = session.query(Users).filter_by(name='alex').first()
r6 = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(Users.id).all()
r7 = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()
"""
常用操作:
# 条件
in_
~ :非 ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
# 连接查询
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3),
Users.extra != ""
)).all() # 通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all() # 限制
ret = session.query(Users)[1:2] # 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all() # 分组
from sqlalchemy.sql import func ret = session.query(Users).group_by(Users.extra).all()
# 聚合函数
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all() ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all() # 连表 ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()
# 默认使用外键关系,连接查询
ret = session.query(Person).join(Favor).all() # left join 左外连接
ret = session.query(Person).join(Favor, isouter=True).all()
ret = session.query(Person, Favor).join(Favor, Favor.id == Person.id, isouter=True).all()
ret = session.query(Person, Favor).join(Favor, and_(Person.id>1, Person.id==Favor.id).all() # 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all() q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
原生SQL:
import time
import threading 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
from sqlalchemy.sql import text
from sqlalchemy.engine.result import ResultProxy
from db import Users, Hosts engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/s6", max_overflow=0, pool_size=5)
Session = sessionmaker(bind=engine) session = Session() # 查询
# cursor = session.execute('select * from users')
# result = cursor.fetchall() # 添加
cursor = session.execute('insert into users(name) values(:value)',params={"value":'wupeiqi'})
session.commit()
print(cursor.lastrowid) session.close()
关联子查询:
获取课程最高分:
select id as cid, course_name, (select max(score) from grade where course_id=cid) as maxgrade from course
1.一对多
外键关系:
多对多关系:
book.py
user.py
关系表:gift.py
添加:db.session.add()
db.session.commit()
获取当前用户:current_user
事务回滚:
flask-SQLAlchemy的ORM的更多相关文章
- flask SQLAlchemy中一对多的关系实现
SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如 ...
- flask, SQLAlchemy, sqlite3 实现 RESTful API 的 todo list, 同时支持form操作
flask, SQLAlchemy, sqlite3 实现 RESTful API, 同时支持form操作. 前端与后台的交互都采用json数据格式,原生javascript实现的ajax.其技术要点 ...
- sqlalchemy 的 ORM 与 Core 混合方式使用示例
知乎: sqlalchemy 的 ORM 与 Core 混合方式操作数据库是一种怎样的体验? 答: 酸! 本文基于:win 10 + python 3.4 + sqlalchemy 1.0.13 基本 ...
- sqlalchemy 的 ORM 方式使用示例
知乎: 使用 sqlalchemy 的 orm 方式操作数据库是一种怎样的体验? 答: 酸爽! 本文基于:win10 + python3.4 + sqlAlchemy 1.0.13 先看一个图(来源) ...
- SQLAlchemy的ORM
表关系: 表之间的关系存在三种:一对一.一对多.多对多.而SQLAlchemy中的ORM也可以模拟这三种关系.因为一对一其实在SQLAlchemy中底层是通过一对多的方式模拟的,所以先来看下一对多的关 ...
- SQLAlchemy(1) -- Python的SQLAlchemy和ORM
Python的SQLAlchemy和ORM(object-relational mapping:对象关系映射) web编程中有一项常规任务就是创建一个有效的后台数据库.以前,程序员是通过写sql语句, ...
- flask建表遇到的错误: flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specified key was too long; max key length is 767 bytes')
error:flask,sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1071, 'Specifie ...
- Flask – SQLAlchemy成员增加
目录 简介 结构 展示 技术 运行 代码 创建数据库表单 views视图 home主页 添加成员addnew.html 展示页show_all 简介 结构 $ tree -I "__pyca ...
- python3 + flask + sqlalchemy +orm(3):多对多关系
一篇文章有多个tag,一个tag也可以属于多篇文章,文章和tag存在多对多关系 config.py DEBUG = True #dialect+driver://root:1q2w3e4r5t@127 ...
- python3 + flask + sqlalchemy +orm(2):数据库中添加表
往数据库中添加一张保存文章的表,表明为article,字段有id,title,content 同样一个配置文件:config.py DEBUG = True #dialect+driver://roo ...
随机推荐
- KVO 的代码简洁使用
1.类属性设置与创建 详细使用介绍 KVO 键值观察 // KvoClass.h @interface KvoClass : NSObject @property(nonatomic, copy) N ...
- 基于Haar特征的Adaboost级联人脸检测分类器
基于Haar特征的Adaboost级联人脸检测分类器基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征 ...
- 关于Java中SQL语句的拼接规则
实现目标语句是这个注意,这里的java变量是idd int idd; String sql = "SELECT id, piUrl FROM picinfos WHERE id BETWEE ...
- 【Guava】RateLimiter类
Guava官方文档-RateLimiter类 原文链接 作者:Dimitris Andreou 译者:魏嘉鹏 校对:方腾飞 RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可 ...
- J2EE 的体系结构
J2EE 即Java2平台企业版,它提供了基于组件的方式来设计.开发.组装和部署企业应用.J2EE使用多层分布式的应用模型,这个多层通常通过三层或四层来实现: 1.客户层,运行在客户计算机上的组件. ...
- 删除outlook2007账户
开始-设置-控制面板-邮件-显示配置文件-删除-确定
- ansible基本模块-shell
ansible XXX -m shell -a "XXX"
- 洛谷 P2542 [AHOI2005]航线规划(Link-cut-tree)
题面 洛谷 bzoj 题解 离线处理+LCT 有点像星球大战 我们可以倒着做,断边变成连边 我们可以把边变成一个点 连边时,如果两个点本身不联通,就\(val\)赋为\(1\),并连接这条边 如果,两 ...
- POJ - 1080 枚举 / DP
要求max{F/P},先枚举下界lowf,再贪心求符合约束条件的n个最小价值和 记录F的离散值和去重可以大幅度常数优化 (本来想着用DP做的) (辣鸡POJ连auto都Complie Error) # ...
- GDCM
gdcmconv: gdcm 2.2.4 $Date$ Usage: gdcmconv [OPTION] input.dcm output.dcm Convert a DICOM file int ...