当前位置: 移动技术网 > IT编程>脚本编程>Python > Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)

Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)

2019年09月21日  | 移动技术网IT编程  | 我要评论

每个党员不论职务高低 都必须编入,那一夜的人生申论题,联想旭日410l

一、写在前面

  其实之前已经写过一篇关于 flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 flask + mysql8.0 时所遇到的一些问题(如果用的不是 mysql8.0估计就没有这么多问题了!)。然后这一篇可以算作一份学习笔记了,也是关于在 flask 中进行数据库操作的,感觉写这种学习笔记还是比较有用的,可以再学习一遍也就能更好的掌握了。

  在使用 flask 的时候,一般都会创建一个 model.py,然后在里面继承和创建模型,再迁移到数据库中,最后进行一些增删改查等操作。但是如果数据库表已经建立好了呢?有没有办法将这些数据库表引入到 flask 中呢?

 

二、sqlacodegen

1.sqlacodegen简介

  sqlacodegen pypi:。

  其中对 sqlacodegen 的介绍是:这是一个工具,它读取现有数据库的结构并生成相应的 sqlalchemy 模型代码,如果可能,使用声明式样式。

  sqlacodegen 的几个主要特性为:

  1)支持 sqlalchemy 0.8.x - 1.3.x。

  2)生成几乎看起来像是手写的声明性代码。

  3)生成符合  标准的代码。

  4)准确地确定关系,包括多对多,一对一。

  5)自动检测连接表继承。

2.sqlacodegen安装

  使用 pip 安装即可:

pip install sqlacodegen

3.sqlacodegen用法

  下面是一个 sqlacodegen 用法示例:

sqlacodegen mysql+pymysql://root:qwer1234@127.0.0.1/mydb --tables users,roles,phone >models.py

   首先是一个 sqlacodegen 命令,后面接上连接数据库的语句,然后可以使用 --tables 指定要导入的数据表,最后用 >models.py 输出到 models.py 中,如果不指定输出文件,会将 python 代码直接打印出来。下面是生成的 models.py 中的代码:

 1 # coding: utf-8
 2 from sqlalchemy import column, foreignkey, string
 3 from sqlalchemy.dialects.mysql import integer
 4 from sqlalchemy.orm import relationship
 5 from sqlalchemy.ext.declarative import declarative_base
 6 
 7 base = declarative_base()
 8 metadata = base.metadata
 9 
10 
11 class phone(base):
12     __tablename__ = 'phone'
13 
14     phone = column(string(11), primary_key=true)
15     phone_address = column(string(40))
16 
17 
18 class role(base):
19     __tablename__ = 'roles'
20 
21     role_id = column(integer(11), primary_key=true)
22     role_name = column(string(45))
23 
24 
25 class user(base):
26     __tablename__ = 'users'
27 
28     user = column(string(10), primary_key=true)
29     sex = column(string(10))
30     email = column(string(45))
31     phone = column(string(11))
32     role_id = column(foreignkey('roles.role_id'), index=true)
33 
34     role = relationship('role')

 

三、sql alchemy

1.sql alchemy简介

  sql alchemy pypi:https://pypi.org/project/sqlalchemy/

  sql alchemy 是 python sql 工具包和对象关系映射器,它为应用程序开发人员提供了sql的全部功能和灵活性。

  在写上篇博客的时候简单介绍过 flask-sqlalchemy,当时说到它将对 sql alchemy 的支持添加到 flask 应用程序中,因此我们通过简单设置之后就能在 flask 中队数据库进行操作了,可那是当我们在把定义好的模型映射到数据库中时所用的。如果数据库表已经建好了,还怎么用 flask-sqlalchemy 来操作呢?这时候就需要使用 sql alchemy 了!

2.sql alchemy安装

  使用 pip 安装即可:

pip install sqlalchemy

3.sql alchemy架构

  

  1)schema / types 定义了类到表之间的映射框架(规则)。

  2)sql expression language 封装好的 sql 语句。

  3)engine 操作者。

  4)connection pooling 连接池。

  5)dialect 根据用户的配置,调用不同的数据库 api(如:mysql) 并执行对应的 sql 语句。

4.sql alchemy用法

(1)连接数据库

1 from sqlalchemy import create_engine
2 
3 
4 engine = create_engine("mysql+pymysql://root:qwer1234@127.0.0.1:3306/mydb")

  create_engine() 会返回一个引擎实例,它代表着数据库的接口。这个引擎实例可以执行 sql 语句,例如:

engine.execute("show tables")

(2)创建会话

   光有这个数据库的引擎还不够,还需要建立会话才行,这里要使用引擎来创建一个 session 类的实例,代码为:

 1 from sqlalchemy import create_engine
 2 from sqlalchemy.orm import sessionmaker
 3 
 4 
 5 # 创建引擎
 6 engine = create_engine("mysql+pymysql://root:qwer1234@127.0.0.1:3306/mydb")
 7 # 使用引擎创建session
 8 db_session = sessionmaker(bind=engine)
 9 # 实例化
10 db_session = db_session()

(3)单表 crud

  插入数据:

1 # 插入
2 db_session.execute("insert into roles values(%d,%s)" % (1, "'admin'"))
3 db_session.execute("insert into users values(%s,%s,%s,%s,%d)" % ("'user1'", "'man'", "'user1@163.com'", "'12233445566'", 1))
4 db_session.commit()

  插入数据可以使用 sql 语句来完成,在插入数据之后要使用 commit(),这一点不能忘记。

  查询数据:

1 # 查询
2 result = db_session.query(user).filter(user.user == "user1")
3 print(result.all())
4 usr = result.all()[0]
5 print(usr.email)
6 
7 # [<sqlalchemy.models.user object at 0x0000028d33d7cdd8>]
8 # user1@163.com

  在查询的时候需要使用 query()  和 filter(),返回的结果是一个列表,如果列表为空就表示数据库中没有该记录。对于返回的这个结果,使用 all() 返回所有记录,使用 one() 返回第一条记录。

  更新数据:

1 # 更新
2 db_session.query(user).filter(user.user == "user1").update({user.email: 'user1user1@163.com'})
3 db_session.commit()
4 # 查询
5 result = db_session.query(user).filter(user.user == "user1")
6 usr = result.one()
7 print(usr.email)
8 
9 # user1user1@163.com

  更新数据可以使用 update() 方法,不过要接在 filter() 之后,使用这种方法即使数据库中没有记录也不会报错。

  删除数据:

1 # 删除
2 db_session.query(user).filter(user.user == "user1").delete()
3 # 查询
4 result = db_session.query(user).filter(user.user == "user1")
5 usr = result.one()
6 print(usr.email)
7 
8 # sqlalchemy.orm.exc.noresultfound: no row was found for one()

  删除数据的使用方法和更新数据类似,只不过是在 filter() 之后使用 delete() 方法。

(4)多表查询

   假设要查询 phone 为"12233445566"的用户名称和电话所在地址,就需要将 users 表和 phone 表联合起来进行查询,方法是使用多个 filter():

1 res = db_session.query(user, phone).filter(user.phone == "12233445566").filter(phone.phone == "12233445566")
2 u, p = res.one()
3 print(u.user, p.phone_address)
4 
5 # user1 a

  假设要查询 user 为"user1"的用户的角色信息,就需要将 users 表和 roles 表联合起来进行查询,因为有外键的关系,所以可以使用 join():

1 res = db_session.query(user).join(role).filter(user.user == "user1")
2 u = res.one()
3 print(u.user, u.role.role_name)
4 
5 # user1 admin

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网