Flask中的的SQLAlchemy

Posted 你说我记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask中的的SQLAlchemy相关的知识,希望对你有一定的参考价值。

好久没有更新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:[email protected]: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也可以插入单条,只不过消耗的资源多一些,
View Code

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()
View Code

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)
View Code

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)
View Code

二.一对多的表关系操作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:[email protected]:3306/led?charset=utf8")

Base.metadata.create_all(engine)
View Code

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()
View Code

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()
View Code

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)
View Code

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()
View Code

三。多对多表的操作

未完,待续

 


以上是关于Flask中的的SQLAlchemy的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy模型中的进程字段(使用flask_sqlalchemy)

Flask 学习-13.Flask-SQLAlchemy 新建模型和字段

使用 flask_sqlalchemy 将 HTML 表单中的日期插入 SQlite 数据库

使用 Flask-SQLAlchemy 连接到 MSSQL 数据库

jsonify Flask中的SQLAlchemy结果集[重复]

Flask-SQLAlchemy 中的 LocalProxy 对象