使用PyMySQL的前提:

  1. 先建好表

  2. 自己动手需要手动去写多条SQL语句

改进:

  类 ------>  表

  实例化 -> 数据

这种思想叫:ORM(Object Relationship Mapping)对象关系映射

SQLAlchemy是Python编程语言下的一款ORM框架

SQLAlchemy的操作:

  基本原理:将代码转换成SQL语句执行

1. 创建表

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 # 链接MySQL
engine = create_engine("mysql+pymysql://root@127.0.0.1:3306/day45?charset=utf8", max_overflow = 5) # max_overflow = 5代表最大连接池为5 # 声明Base类,后续的类都要继承Base类
Base = declarative_base() # 创建单表
"""
create table user(
id int auto_increment primary key,
name varchar(32) not null default '',
extra varchar(32) not null default ''
)engine=Innodb charset=utf8
""" # 创建usertype, 并设置id,title
class UserType(Base):
__tablename__ = "usertype" # 表名
id = Column(Integer, autoincrement=True, primary_key=True)
title = Column(String(32), nullable=False,server_default="") # 创建user表,并设置表的id, name, extra
class Users(Base):
__tablename__ = 'user' # 表名
id = Column(Integer, autoincrement=True, primary_key=True) # Column:字段,列
name = Column(String(32), nullable=False, server_default="")
# name = Column(String(32), nullable=False, server_default="", unique=True) # 给name这一列添加唯一索引
extra = Column(String(32), nullable=False, server_default="") # extra:特点 # 外键(让User中的id与UserType中的id发生了外键的关系)
type_id = Column(Integer, ForeignKey(UserType.id))
# type_id = Column(Integer, ForeignKey("usertype".id)) # # 添加索引
# __table_args__ = (
# UniqueConstraint("id", "name", name="uix_id_name"), # 给id,name添加联合唯一索引
# Index("ix_id_name","name", "extra") # 给name,extra添加普通索引
# ) # 删除表
def drop_db():
Base.metadata.drop_all(engine) # 会将当前文件中所有继承自Base类的类,生成表
def create_db():
Base.metadata.create_all(engine)

2. 操作表

# 操作表中的数据
Session = sessionmaker(bind=engine)
session = Session() # session:窗口, 实例化Session,相当于从连接池中拿一个连接过来进行操作

2.1 添加数据

# 往UserType中添加数据, 因为UserType与User存在外键联系,所以给UserType添加数据,则再往User中添加数据时,type_id就会有数据产生

# 添加一条数据
obj = UserType(title = "普通用户")
session.add(obj) # 把对象数据添加到数据库中 # 添加多条数据
session.add_all([
UserType(title = "VIP用户"),
UserType(title = "VIP中P用户"),
UserType(title = "SVIP用户"),
UserType(title = "黑金用户")
]) session.commit()
session.close()

2.2 查询数据

2.2.1 普通查询(.all(), .first())

res = session.query(UserType)   # 这一步就是将代码转换成SQL语句
print(res) # SELECT usertype.id AS usertype_id, usertype.title AS usertype_title FROM usertype # 查询全部,返回的是列表,列表中是对象
res = session.query(UserType).all() # .all()就是讲SQL语句发送给服务端执行SQL指令,得到一个列表对象
print(res) # [<__main__.UserType object at 0x00000164C846BEF0>, <__main__.UserType object at 0x00000164C846BF60>, <__main__.UserType object at 0x00000164C846BDA0>, <__main__.UserType object at 0x00000164C846BDD8>, <__main__.UserType object at 0x00000164C846BC88>]
for k in res:
print(k.id, k.title) # 1 普通用户
# 2 VIP用户
# 3 VIP中P用户
# 4 SVIP用户
# 5 黑金用户 # 查询一条,获得一条对象
res = session.query(UserType).first()
print(res) # <__main__.UserType object at 0x000001640E9EBDD8>
print(res.id, res.title) # 1 普通用户

2.2.2 类似sql中的where查询(filter(), filter_by())

# filter
res = session.query(UserType).filter(UserType.title=="VIP用户") # filter 将查找(过滤)的条件转换成SQL语句
print(res) # SELECT usertype.id AS usertype_id, usertype.title AS usertype_title FROM usertype WHERE usertype.title = %(title_1)s res = session.query(UserType).filter(UserType.title=="VIP用户", UserType.id==2).all() # .first()与上一样
print(res) # [<__main__.UserType object at 0x000002C1ADFD73C8>]
for row in res:
print(row.id, row.title) # 2 VIP用户
print(res[0].id, res[0].title) # 2 VIP用户 # filter_by 传入的是一个类似key=value的数据, filter中传入的是一个表达式
res = session.query(UserType).filter_by(title="VIP用户").all()
print(res) # [<__main__.UserType object at 0x000001FCDB07FDA0>]

2.3 删除数据(delete)

# 删除数据之前先查找数据
session.query(UserType).filter(UserType.id>3).delete()
session.query(UserType).delete() # 相当于删除整个表

2.4 修改数据(update)

session.query(UserType).filter(UserType.id == 3).update({"title":"SVIP用户"})  # 将id=3数据的title的值改为SVIP用户

2.5 高级查询

"""
高级查询: 通配符、分组、排序、between and、in、not in、or
"""
"""
此时数据恢复成如下所示
+----+------------+
| id | title |
+----+------------+
| 1 | 普通用户 |
| 2 | VIP用户 |
| 3 | VIP中P用户 |
| 4 | SVIP用户 |
| 5 | 黑金用户 |
+----+------------+
""" # 逗号默认为 and
res = session.query(UserType).filter(UserType.id==2, UserType.title=="VIP用户").all()
for row in res:
print(row.id, row.title) # row # between(1,3) 在1到3的范围内,包括1和3
res = session.query(UserType).filter(UserType.id.between(1,3 )).all()
for row in res:
print(row.id, row.title) # 1 普通用户
# 2 VIP用户
# 3 VIP中P用户 # in not in
res = session.query(UserType).filter(UserType.id.in_([1,3,4])).all()
ret = session.query(UserType).filter(~UserType.id.in_([1,3,4])).all()
print(res) # [<__main__.UserType object at 0x000002839AD46048>, <__main__.UserType object at 0x000002839AD46198>, <__main__.UserType object at 0x000002839AD46278>]
print(ret) # [<__main__.UserType object at 0x000002839AD467B8>, <__main__.UserType object at 0x000002839AD46828>] rer = session.query(UserType).filter(UserType.id.in_(session.query(UserType.id).filter_by(title='VIP用户'))).all()
print(rer) # [<__main__.UserType object at 0x0000023CBD0D57B8>] from sqlalchemy import and_,or_
ret = session.query(UserType).filter(and_(UserType.id > 3, UserType.title == 'VIP用户')).all()
res = session.query(UserType).filter(or_(UserType.id < 2, UserType.title == 'VIP用户')).all()
print(ret)
print(res) # 通配符
ret = session.query(UserType).filter(UserType.title.like('S%')).all()
res = session.query(UserType).filter(~UserType.title.like('S%')).all()
print(ret)
print(res) # 排序
ret = session.query(UserType).order_by(UserType.title.desc()).all()
res = session.query(UserType).order_by(UserType.title.desc(), UserType.id.asc()).all() # 分组 group_by
"""
+----+----------+-------+---------+
| id | name | extra | type_id |
+----+----------+-------+---------+
| 1 | wangyong | nb | 5 |
| 2 | liguo | cb | 3 |
| 3 | jiyuzhi | sb | 1 |
| 4 | kelinwei | zb | 3 |
| 5 | gouyang | bb | 2 |
+----+----------+-------+---------+
"""
from sqlalchemy.sql import func
res = session.query(
Users.type_id,
func.max(Users.id),
func.min(Users.id)).group_by(Users.type_id).all()
print(res) # [(1, 3, 3), (2, 5, 5), (3, 4, 2), (5, 1, 1)] res = session.query(
Users.type_id,
func.max(Users.id),
func.min(Users.id)).group_by(Users.type_id).having(func.min(Users.id)>2).all()
print(res) # [(1, 3, 3), (2, 5, 5)] """
连表
"""
res = session.query(Users).join(UserType)
print(res)
# SELECT user.id AS user_id, user.name AS user_name, user.extra AS user_extra, user.type_id AS user_type_id
# FROM user INNER JOIN usertype ON usertype.id = user.type_id res = session.query(Users).join(UserType,isouter=True) # 会自动检测是否含有外键,如果存在,会自动进行关联
print(res)
# SELECT user.id AS user_id, user.name AS user_name, user.extra AS user_extra, user.type_id AS user_type_id
# FROM user LEFT OUTER JOIN usertype ON usertype.id = user.type_id res = session.query(Users).join(UserType,isouter=True).all() # 存在问题:只能查询到Users表的值,UserType表中的值无法查询
print(res) # [<__main__.Users object at 0x0000026AD9D74898>, <__main__.Users object at 0x0000026AD9D74908>, <__main__.Users object at 0x0000026AD9D74978>, <__main__.Users object at 0x0000026AD9D749E8>, <__main__.Users object at 0x0000026AD9D74A58>]
for row in res:
print(row.id, row.name) # 1. 想要既能查询到Users表中数据,又能查询到UserType中的数据
# 方法一:
res = session.query(Users, UserType).join(UserType,isouter=True).all() # 存在问题:只能查询到Users表的值,UserType表中的值无法查询
for row in res:
print(row[0].id, row[0].name, row[1].title) # 方法二:使用relationship 在Users类中加入
usertype = relationship('UserType') # 关联到UserType,在创建User表时,会将UserType的数据添加到Users中,但是不会显示出来,就相当于一个隐藏属性 res = session.query(Users).all()
for row in res:
print(row.id, row.name, row.extra, row.usertype.title) # 2.想要知道某一个类型下面的用户
# 第一种
res = session.query(UserType).all()
for row in res:
print(row.id, row.title, session.query(Users.id).filter(Users.type_id==row.id).all()) # 第二种 在定义Users类时,继续添加 usertype = relationship('UserType', backref = "xxoo") backref:反向查询 res = session.query(UserType).all()
for row in res:
print(row.id, row.title, row.xxoo) # row.xxoo 多条记录查询 # relationship 哪张表中有外键,就把relationship 放在哪张表中

sqlalchemy 的操作的更多相关文章

  1. 第二百八十九节,MySQL数据库-ORM之sqlalchemy模块操作数据库

    MySQL数据库-ORM之sqlalchemy模块操作数据库 sqlalchemy第三方模块 sqlalchemysqlalchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API ...

  2. SQLAlchemy基础操作一

    用前安装 pip3 install sqlalchemy ORM ORM就是运用面向对象的知识,将数据库中的每个表对应一个类,将数据库表中的记录对应一个类的对象.将复杂的sql语句转换成类和对象的操作 ...

  3. SQLAlchemy表操作和增删改查

    一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...

  4. Flask入门之SQLAlchemy数据库连接操作(第15讲)

    一.库安装 Flask-SQLAlchemy 2 SQLAlchemy 1.0.8 二.进入venv 三.切换到项目Sample\ 文件夹,进入manager.py 的shell python man ...

  5. sqlalchemy orm 操作 MySQL

    一.ORM介绍 orm英文全称object relational mapping,是对象映射关系程序,简单来说类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了 ...

  6. 基于Python的SQLAlchemy的操作

    安装 在Python使用SQLAlchemy的首要前提是安装相应的模块,当然作为python的优势,可以到python安装目录下的scripts下,同时按住shift+加上鼠标左键,从而在菜单中打开命 ...

  7. SQLAlchemy常用操作

    Models 只是配置和使用比较简单,因为他是Django自带的ORM框架,也正是因为是Django原生的,所以兼容性远远不如SQLAlchemy 真正算得上全面的ORM框架必然是我们的SQLAlch ...

  8. sqlalchemy相关操作(ORM)

    环境:python3.7,pycharm,mysql ORM(Object-Relational-Mapper) 对象关系映射(ORM)是一种允许您使用面向对象的范例从数据库查询和操作数据的技术,sq ...

  9. SQLAlchemy基础操作二

    多线程示例 import time import threading from sqlalchemy.ext.declarative import declarative_base from sqla ...

随机推荐

  1. kudu_CM安装准备工作

    Cloudera Manager简介: hadoop: https://yq.aliyun.com/articles/60759 ----------------------------------- ...

  2. LINUX查看内存使用情况 free

    # free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KB used 已使用的内存 7852484KB free 空闲的内存数 205480KB shared 当 ...

  3. mongodb命令----批量更改文档字段名

    因为mongodb基于javascript的特性,为了体验cursor的威力我们不妨利用js的for循环创建记录 先创建文档 db.createCollection("columnsampl ...

  4. codeforces#562 Div2 C---Increasing by modulo【二分】

    题目:http://codeforces.com/contest/1169/problem/C 题意: 有n个数,每次可以选择k个,将他们+1并对m取模.问最少进行多少次操作,使得序列是非递减的. 思 ...

  5. java接口的多继承

    Java类之间并不允许多继承,只可以单继承和实现多接口,一直以为接口也是一样的,但是查阅了相关资料,突然豁然开朗. 一个类只能extends一个父类,但可以implements多个接口. 一个接口则可 ...

  6. 小米 oj 硬币比赛(思维+动态规划)

     硬币比赛 序号:#47难度:困难时间限制:1000ms内存限制:10M 描述 有 n 个不同价值的硬币排成一条线.有 A 与 B 两个玩家,指定由 A 开始轮流(A 先手,然后 B,然后再 A..) ...

  7. 数据结构实验之链表七:单链表中重复元素的删除(SDUT 2122)

    #include <bits/stdc++.h> using namespace std; typedef struct node { int data; struct node* nex ...

  8. 网络编程udp入门

    老师布置的作业 echo4_server.c #include<stdio.h> #include<stdlib.h> #include<string.h> #in ...

  9. ubuntu 安装eclipse for c++

    linux的GUI和windos比起来实在逊色,虽然它的终端模式(命令行模式)非常强大.linux发行版ubuntu的GUI相对其他版本要华丽一些,所以最近由redhat转向ubuntu进行linux ...

  10. Qt 字符串QString arg()用法总结

    1.QString::arg()//用字符串变量参数依次替代字符串中最小数值 QString i = "iTest";           // current file's nu ...