好久没有更新Blog了

今天来聊一聊 Python 的 ORM 框架 SQLAlchemy 有的孩子已经听说过这个框架的大名了,也听说了 SQLAlchemy 没有 Django 的 Models 好用

我在这里辟谣一下, Models 紧紧只是配置和使用比较简单,因为他是Django自带的ORM框架,也正是因为是Django原生的,所以兼容性远远不如SQLAlchemy

真正算得上全面的ORM框架是我们的SQLAlchemy ORM框架,它可以在任何使用SQL查询时使用

当然了,无论是使用什么ORM框架,都是为了方便不熟练数据库的同学使用的,个人还是比较推崇原生 SQL 哈

ok,我们来看一下 SQLAlchemy 如何使用:

1.创建表的一波说不出来但很牛x的操作

#create_table.py 
#通过SQLAlchemy创建数据表
# 1.导入SQLAlchemy,没安装的记得安装一下啊
from sqlalchemy.ext.declarative import declarative_base # 2.创建ORM模型基类
Base = declarative_base() # 相当于Django Model # 3.导入ORM对应数据库数据类型的字段
from sqlalchemy import Column, Integer, String # 4.创建ORM对象
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(32), index=True) # 5.创建数据库连接
from sqlalchemy import create_engine #mysql+pymysql用mysql数据库+pymysql,root用户,614615数据库密码,@127.0.0.1本地地址,3306数据库端口号,led数据库名,剩下的是字符编码,这要是不懂,滚!!!
engine = create_engine("mysql+pymysql://root:614615@127.0.0.1:3306/led?charset=utf8")
# 数据库连接创建完成 # 6.去数据库中创建与User所对应的数据表
# 去engine数据库中创建所有继承Base类的 ORM对象
Base.metadata.create_all(engine)

2.增的操作

#curd_insert.py

# 增
# 1.打开数据库的链接
from create_table import engine
# 2.创建绘画
from sqlalchemy.orm import sessionmaker
# 3.创建会话的窗口
Session = sessionmaker(engine)
# 4.打开会话窗口
db_session = Session()
from create_table import User
with open('name.txt','r')as f:
for i in f.read():
db_session.add_all([
User(name=i),
]) db_session.commit()
db_session.close()
#这里说一下,add和add_all的区别,就是单挑和多条的差距,当然,add_all也可以插入单条,只不过消耗的资源多一些,

3.5改的高级操作

#curd_update_more.py

from sqlalchemy.orm import sessionmaker
from create_table import User,engine
Session = sessionmaker(engine)
db_session = Session() #直接修改
db_session.query(User).filter(User.id > 10).update({"name":""})
db_session.commit()
db_session.close() #原有值的基础上添加 -2
db_session.query(User).filter(User.id > 0).update({User.name:User.name + "-2"},synchronize_session=False)
db_session.commit()
db_session.close()

3.改的操作

#curd_update.py

# 更新

from sqlalchemy.orm import sessionmaker
from create_table import User,engine
Session = sessionmaker(engine)
db_session = Session() ret = db_session.query(User).filter(User.name == "李志强").update({"name":"好人"})
db_session.commit()#切记!!执行语句
db_session.close()#关闭会话 ret = db_session.query(User).filter(User.id >=60).update({"name":"我是好人"})
db_session.commit()
db_session.close()

4.查的操作

#curd_select.py

#查

from create_table import engine
from create_table import User
from sqlalchemy.orm import sessionmaker Session = sessionmaker(engine)
db_session = Session() # 1.简单的查询
res = db_session.query(User).all()
for i in res:
print(i.name) res_list = db_session.query(User).first()
print(res_list.id) # 2.有条件的查询
ret = db_session.query(User).filter(User.name == "李二短").first()
# 因为这里查到一个所以不会用索引取值
print(ret.name,ret.id) ret = db_session.query(User).filter(User.name == "浩").all()
# 这里查到所有所以会用索引取值第一个
print(ret[0].name,ret[0].id) ret = db_session.query(User).filter(User.id >= 60).all()
# 这里说一下,查询所有的id>=60的,查询所有进行遍历取值
for i in ret:
print(i.name,i.id) # 查看原生的sql语句办法
ret = db_session.query(User).filter(User.id >= 60)
print(ret)

5.删除的操作

curd_delete.py
# 删除 from sqlalchemy.orm import sessionmaker
from create_table import engine,User Session = sessionmaker(engine)
db_session = Session() ret = db_session.query(User).filter(User.name == "我是好人").delete()
db_session.commit()
db_session.close()
# print(ret) ret = db_session.query(User).filter(User.id >= 20).delete()
db_session.commit()
db_session.close()
# print(ret)

二.一对多的表关系操作ForeginKey

1.创建一对多的表关系

#create_table_ForeginKey.py

# 一对多建表操作
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import create_engine
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship class School(Base):
__tablename__ = 'school'
id = Column(Integer,primary_key=True)
name = Column(String(32)) class Student(Base):
__tablename__ = 'student'
id = Column(Integer,primary_key=True)
name = Column(String(32))
school_id = Column(Integer,ForeignKey("school.id"))
stu2sch = relationship("School",backref="stu2sch") engine = create_engine("mysql+pymysql://root:614615@127.0.0.1:3306/led?charset=utf8") Base.metadata.create_all(engine)

2.增加数据

#curd_insert_ForeginKey.py

#添加数据
from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import Student,School,String,Integer,engine Session = sessionmaker(engine)
db_session = Session() # 正向的添加数据 relationship版本
sch_obj = School(name="清华")
sch_obj.stu2sch = [Student(name="李志强"),Student(name="李二短")]
db_session.add(sch_obj)
db_session.commit()
db_session.close() #反向的添加数据 relationship版本
stu_obj = Student(name="龙龙",stu2sch=School(name="北大"))
db_session.add(stu_obj)
db_session.commit()
db_session.close()

3.修改操作

curd_update_ForeginKey.py

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import School,Student,String,Integer,engine Session = sessionmaker(engine)
db_session = Session() sch = db_session.query(School).filter(School.name == "清华").first()
# 查到学校的id,在学生表里查到学生是龙龙的学生把学校id改成察到的学校id
db_session.query(Student).filter(Student.name == "龙龙").update({"school_id":sch.id})
db_session.commit()
db_session.close()

4.查的操作

#curd_select_ForeginKey.py

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import School,Student,engine,String,Integer Session = sessionmaker(engine)
db_session = Session() #relationship正向查询版本
stu = db_session.query(Student).all()
for i in stu:
print(i.name,i.id,i.stu2sch.name) # relationship反向查询版本
sch = db_session.query(School).all()
for school in sch:
for student in school.stu2sch:
print(school.id,school.name,student.name)

5.delete

#curd_delete_ForeginKey.py

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import Student,School,String,Integer,engine Session = sessionmaker(engine)
db_session = Session() sch = db_session.query(School).filter(School.name == '北大').first()
print(sch.id)
db_session.query(Student).filter(Student.school_id == sch.id).delete()
db_session.commit()
db_session.close()

三。多对多表的操作

未完,待续

Flask中的的SQLAlchemy的更多相关文章

  1. Flask中的的SQLAlchemy2

    昨天更新了博客不知对各位职场的大佬有没有帮助,如果没有看到的请用小手狠狠地戳这里 Flask中的的SQLAlchemy 今天呢,我们来说一下多对多表的关系,知道不?开始之前我先说一个事,昨晚更新了博客 ...

  2. flask 中的ORM

    1 响应(response) 1 什么是响应 响应就是由服务器端带给客户端的内容,对应着请求,响应可以是普通的字符串,模板 或重定向 return '普通字符串' return render_temp ...

  3. Flask 中的 SQLAlchemy 使用教程

    Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...

  4. python web开发-flask中sqlalchemy的使用

    SqlAlchemy是一个python的ORM框架. 在flask中有一个flask-sqlalchemy的扩展,使用起来很方便. 1.       创建一个sqlalchemy的Model模块 创建 ...

  5. flask 中orm关系映射 sqlalchemy的查询

    flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询   一对多,多对多是什么? 一对多.例如,班级与学生,一个班级对应多个学生,或者多个学生对应一个班级. 多对多.例如,学生与课 ...

  6. flask框架----整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

  7. Python框架学习之Flask中的数据库操作

    数据库操作在web开发中扮演着一个很重要的角色,网站中很多重要的信息都需要保存到数据库中.如用户名.密码等等其他信息.Django框架是一个基于MVT思想的框架,也就是说他本身就已经封装了Model类 ...

  8. 整合Flask中的目录结构

    一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from ...

  9. flask中如何生成迁移文件

    在flask网站开发中,如果直接对数据库进行修改的话,风险比较高,最好的是由迁移文件生成,这样确保了数据的误操作. 在Flask中可以使用Flask-Migrate扩展,来实现数据迁移.并且集成到Fl ...

随机推荐

  1. springMVC传对象参数

    springController: [java] view plaincopy @Controller @RequestMapping("/user") public UserCo ...

  2. JAVA的String 类【转】

    String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s ...

  3. 使用Sencha Cmd创建脚本框架

    从Ext JS 4.1.1a 开始,为了配合 Sencha Touch开发  而设计了 Sencha Cmd这个跨平台的命令行工具. 要使用Sencha Cmd,必须先安装好 Java Run-tim ...

  4. 建造者(Builder)模式 *

    一. 建造者(Builder)模式 建造者模式可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 二. Builder模式的结构: 建造者(Bu ...

  5. 【转】ANDROID自定义视图——onLayout源码 流程 思路详解

    转载(http://blog.csdn.net/a396901990) 简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局 ...

  6. js作用域解析原理

    当代码进入到<script>标签或者在调用一个方法,那么就会进入作用域,在解析代码的时候就会做以下两件事情: ①去找var 和function关键字进行js预解析如果有var把值全部定义成 ...

  7. 仓储(Repository)和工作单元模式(UnitOfWork)

    仓储和工作单元模式 仓储模式 为什么要用仓储模式 通常不建议在业务逻辑层直接访问数据库.因为这样可能会导致如下结果: 重复的代码 编程错误的可能性更高 业务数据的弱类型 更难集中处理数据,比如缓存 无 ...

  8. sklearn的train_test_split函数

    train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. from sklearn.model_selection import ...

  9. 【洛谷1685】游览 拓扑排序+DP

    题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!!于是你还想乘船从桃 ...

  10. js 自定义属性

     html标签中有没有什么自带的属性可以存储成绩的----没有  本身html标签没有这个属性,自己(程序员)添加的,----自定义属性---为了存储一些数据  在html标签中添加的自定义属性,如果 ...