SqlAlchemy的简单使用
1.SQLAlchemy
SQLAlchemy是python的一个通用的ORM框架
1.1 创建数据表
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Integer, String, Column
BaseModel = declarative_base()
class User(BaseModel):
# 定义表名
__tablename__ = 'user'
id = Column(Integer, primary_key=True) # 定义主键字段,如果是int型,就会自动自增
name = Column(String(32), nullable=False, unique=True) # 定义字符串非空,唯一字段
# 创建一个引擎连接数据库
from sqlalchemy import create_engine
# 格式:engine = create_engine("postgresql://scott:tiger@localhost/test?charset=utf8")
# "数据库种类+数据库驱动://用户名:密码@IP地址:端口号/数据库名" 端口号不写,使数据库默认端口
engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/test')
# 扫描BaseModel下所有的继承它的model,并创建
BaseModel.metadata.create_all(engine)
1.2 增删改查
1.2.1 新增数据
# 导入创建好的model
from models import User
# 创建一个model对象
user = User(name='tom')
# 写入数据库
# 首先要打开数据库会话,相当于创建一个操作数据库的窗口
from sqlalchemy.orm import sessionmaker
# 导入之前创建好的引擎
from models import engine
# 通过数据库引擎创建会话类
Session = sessionmaker(engine)
# 打开会话对象,相当于新建了一个查询窗口
session = Session()
# 在会话中添加一条model数据
session.add(user)
# 提交会话,将会话中的所有数据提交到数据库
session.commit()
# 关闭会话
session.close()
'''
可以一次添加多条数据,然后再提交
session.add(User(name='rose'))
session.add(User(name='jack'))
session.commit()
session.close()
或者使用列表
user_list = [
User(name='rose'),
User(name='jack'),
]
session.add_all(user_list)
session.commit()
session.close()
'''
1.2.2 查询数据
from models import User, engine
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
# 查询所有的数据
user_list = session.query(User).all()
for user in user_list:
print(user.name)
# 根据条件查询
user_list = session.query(User).filter(User.id > 1).all()
for user in user_list:
print(user.id, user.name)
#对于等于的条件要用双等号
user = sessiom.query(User).filter(User.id==3).first()
#或使用filter_by
user = session.query(User).filter_by(User.id=3).first()
# 也可以取出一个
user = session.query(User).filter(User.id > 1).first()
print(user.id, user.name)
# 通过all()和first()取出数据,如果不取出数据返回的是原生的sql
sql = session.query(User).filter(User.id > 1)
print(sql)
'''
SELECT user.id AS user_id, user.name AS user_name
FROM user
WHERE user.id > %(id_1)s
'''
session.close()
1.2.3 修改数据
from models import User, engine
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
# 要修改数据首先要查询到数据,然后再对其进行修改
res = session.query(User).filter(User.id == 1).update({'name': 'tree'})
print(res) # 返回修改的条数
session.commit() # 增删改都要提交后,才会对数据库数据进行修改
session.close()
1.2.4 删除数据
from models import User, engine
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
# 要删除数据首先要查询到数据,然后再对其进行修改
res = session.query(User).filter(User.id == 1).delete()
print(res) # 返回删除的条数
session.commit() # 增删改都要提交后,才会对数据库数据进行修改
session.close()
1.3 高级查询
from models import User, engine
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(engine)
session = Session()
# 根据多条件查询
from sqlalchemy.sql import and_, or_, text
Users = session.query(User).filter(and_(User.id >= 1, User.name == 'rose')).all()
print(Users)
Users = session.query(User).filter(or_(User.id >= 1, User.name == 'rose')).all()
print(Users)
# 指定查询数据列,和别名
Users = session.query(User.name.label('user_name')).all()
print(Users) # [('jack',), ('rose',)]
for user in Users:
print(user.user_name) # 需要用别名来取
# 表达式筛选条件
Users = session.query(User).filter(User.id == 2).all()
print(Users)
# 原生sql筛选条件
Users = session.query(User).filter_by(id=2).all()
print(Users)
# 字符串方式方式筛选条件,并使用 order_by进行排序
Users = session.query(User).filter(text("id<:value and name=:name")).params(value=7, name='aaa').order_by(
User.id).all()
print(Users)
1.4 一对多创建
from sqlalchemy.ext import declarative
from sqlalchemy.engine import create_engine
from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.orm import relationship
BaseModel = declarative.declarative_base()
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/test?charset=utf8")
class School(BaseModel):
__tablename__ = "school"
id = Column(Integer, primary_key=True)
name = Column(String(32), unique=True)
class Student(BaseModel):
__tablename__ = "student"
id = Column(Integer, primary_key=True)
name = Column(String(32), unique=True)
sch_id = Column(Integer, ForeignKey("school.id"))
school = relationship("School", backref="student")
BaseModel.metadata.create_all(engine)
1.5 一对多的CURD
#增加数据
#方式一(和ORM无关系):先建立一个学校,再查询这个学校的id,根据这个id去创建学生并添加sch_id
#方式二:通过relationship 正向添加
stu = Student(name='张三', school=School(name="清华大学"))
session.add(stu)
session.commit()
session.close()
#方式三:通过relationship反向添加
sch = School(name="北京大学")
sch.student = [
Student(name="李四"),
Student(name="王五")
]
session.add(sch)
session.commit()
session.close()
#删除数据,和单表删除一样,但若是学校被引用则无法删除
#查询数据
#正向查询
stu_list = session.query(Student).all()
for stu in stu_list:
print(stu.name, stu.school.name)
#反向查询
school_list = session.query(School).all()
for school in school_list:
#print(school.name,len(school.student)) 查询每个学校的学生个数
for stu in school.student:
print(school.name, stu.name)
1.6 多对多创建
from sqlalchemy.ext import declarative
from sqlalchemy.engine import create_engine
from sqlalchemy import Column, String, Integer, ForeignKey
from sqlalchemy.orm import relationship
BaseModel = declarative.declarative_base()
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/test?charset=utf8")
class Girl(BaseModel):
__tablename__ = "girl"
id = Column(Integer, primary_key=True)
name = Column(String(32), unique=True)
boy = relationship("Boy", backref="girl", secondary="hotel") # secondary指定第三张表
class Boy(BaseModel):
__tablename__ = "boy"
id = Column(Integer, primary_key=True)
name = Column(String(32), unique=True)
class Hotel(BaseModel):
__tablename__ = 'hotel'
id = Column(Integer, primary_key=True)
gid = Column(Integer, ForeignKey("girl.id"))
bid = Column(Integer, ForeignKey("boy.id"))
BaseModel.metadata.create_all(engine)
1.7 多对多的CRUD
from sqlalchemy.orm import sessionmaker
from createM2M import engine,Girl,Boy
Session = sessionmaker(engine)
session = Session()
# 添加数据
# 正向添加
girl = Girl(name='小红', boy=[Boy(name="小明"), Boy(name="小王")])
session.add(girl)
session.commit()
session.close()
#反向添加数据
boy = Boy(name='小李')
boy.girl = [
Girl(name="小丽"),
Girl(name="小花")
]
session.add(boy)
session.commit()
session.close()
#查询
#正向查询
res = session.query(Girl).all()
for i in res:
print(i.name, len(i.boy))
#反向查询
res = session.query(Boy).all()
for i in res:
print(i.name, len(i.girl))
SqlAlchemy的简单使用的更多相关文章
- Python-ORM之sqlalchemy的简单使用
ORM之sqlalchemy 基础章节 使用SQLAlchemy链接数据库 from sqlalchemy import create_engine from sqlalchemy.ext.decla ...
- MySQLdb与sqlalchemy的简单封装
一:MySQLdb # !/usr/bin/python # -*- coding: UTF-8 -*- import MySQLdb import MySQLdb.cursors import co ...
- python SQLAlchemy的简单配置和查询
背景: 今天小鱼从0开始配置了下 SQLAlchemy 的连接方式,并查询到了结果,记录下来 需要操作四个地方 1. config ------数据库地址 2.init ----- 数据库初始化 3 ...
- sqlalchemy(一)基本操作
sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...
- SQLAlchemy指南(tutorial)
对应版本: 0.3.4 目录 1 安装 1.1 安装SQLAlchemy 1.2 安装一个数据库API 2 快速开始 2.1 导入 2.2 连接到数据库 3 SQLAlchemy是两个库的包装 4 操 ...
- python数据库操作之pymysql模块和sqlalchemy模块(项目必备)
pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 1.下载安装 pip3 install pymysql 2.操作数据库 (1).执行sql #! ...
- sqlalchemy操作Mysql
SQLAlchemy“采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”.SQLAlchemy的理念是,SQL数据库的量级和性能重要于对象集合:而对象集合的抽象又 ...
- SQLAlchemy 教程 —— 基础入门篇
SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLA ...
- flask项目结构(四)使用sqlalchemy和alembic
简介 其实我不是啥正经人,错了,不是啥正经程序员,所能想到的估计也就码农一级吧,高级程序员,搞什么算法,什么人工智能,大数据计算…………离我还太遥远. 但是这并不妨碍我继续学习,继续写垃圾小程序. 反 ...
随机推荐
- Maven实战03_Maven使用入门
1:pom.xml Maven项目的核心文件,非常重要.POM(Project Object Model)项目对象模型,其定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. 创建一个最简单 ...
- JDBC中DAO+service设计思想
一.DAO设计思想 a) Data access Object(数据访问对象):前人总结出的一种固定模式的设计思想. 高可读性. 高复用性. 高扩展性. b) JDBC代码实现的增删改查操作是有复用需 ...
- 2019-7-2-Roslyn-开发-NuGet-包的-Task-编译可能遇到的问题
title author date CreateTime categories Roslyn 开发 NuGet 包的 Task 编译可能遇到的问题 lindexi 2019-07-02 10:43:2 ...
- springcloud:RPC和HTTP
1.RPC和HTTP 无论是微服务还是SOA,都面临着服务间的远程调用.那么服务间的远程调用方式有哪些呢? 常见的远程调用方式有以下2种: RPC:Remote Produce Call远程过程调用, ...
- Leetcode447.Number of Boomerangs回旋镖的数量
给定平面上 n 对不同的点,"回旋镖" 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序). 找到所有回旋镖的 ...
- SSM1-Maven入门
Maven项目管理工具 Svn eclipse maven量级 1 Maven的简介 1.1 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理j ...
- redis为什么快
今天面试的时候被问到的一个问题,大致说了几点.回去又研究了一下. 大致分为几点: 1:Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快. ...
- Struts_添加客户练习
1.修改CustomerAction,实现ModelDriven接口 2.修改配置文件 3.修改表单提交地址
- 配置管理 ACM 在高可用服务 AHAS 流控降级组件中的应用场景
应用配置管理(Application Configuration Management,简称 ACM)是一款应用配置中心产品.基于ACM您可以在微服务.DevOps.大数据等场景下极大地减轻配置管理的 ...
- poj 2001 Shortest Prefixes(字典树trie 动态分配内存)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15610 Accepted: 673 ...