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 ...
随机推荐
- day2学python 数据类型+深浅拷贝+循环
数据类型+深浅拷贝+循环 别的语言的数组 python不用定义 直接使用 color=['红','橙','黄','绿','青','蓝','紫'] print(color[1:3]) //打印[1,3) ...
- 移动端页面怎么适配ios页面
1.viewport 简单粗暴的方式:<meta name="viewport" content="width=320,maximum-scale=1.3,user ...
- java中容器的概念
容器:顾名思义,装东西的器物至于spring中bean,aop,ioc等一些都只是实现的方式具体容器哪些值得我们借鉴,我个人觉得是封装的思想.将你一个独立的系统功能放到一个容器之中,可以当做一个大的接 ...
- 转载智能家居 作者:热情的沙漠 出处:http://www.cnblogs.com/buptzym/
理工男打造帝都89平智能家庭 毕业后的2016年年初,搬入新家,总算不用在出租屋里鬼混了,于是就想把之前童年的梦想:智能家居+家庭影院好好实现一下~ 相比帝都高昂的房价,这些东东还凑合玩得起,不过 ...
- dubbo源码分析--dubbo spi解析
1. 什么叫SPI? 简单总结就是一种使用类名字符串来动态实例化java类的方式,也就是反射. 2. java SPI与Dubbo SPI有什么区别 (此图来自网上,我没有刻意去截图) 然后在这个文件 ...
- VS2017+DLib_19.17详细配置教程
最近学校布置了一个关于图像融合的作业,于是想利用Learn OpenCV 网站上的Face Morph 教程来设计一个人脸融合的Gif图,但是程序中需要用到DLib库,光是配置这个库就花费了我半天 ...
- django form tips
1.form将获取的参数传递到field 2.field中的函数 to_python 数据库到python中变量 get_prep_value python变量到数据库 validate 验证,也可以 ...
- [HEOI2012]采花 树状数组 BZOJ 2743
题目描述 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花. 花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于 ...
- Docker 查看容器环境变量
#linux指令# printenv
- python-继承,父类,子类
class Spell(object): def __init__(self, incantation, name): self.name = name self.incantation = inca ...