简说Python之flask-SQLAlchmey的web应用
系统环境:Ubuntu 18.04.1 LTS
Python使用的是虚拟环境:virutalenv
Python的版本:Python 3.6.9
原生语句操作MySQL数据库
1.安装MySQL
zsd@zsd-virtual-machine:~$ sudo apt-get install mysql-server libmysqlclient-dev -yq
安装PyMySQL[为python3可以驱动MySQL使用]
(zsdpy1) zsd@zsd-virtual-machine:~$ pip install PyMySQL
2.MySQL设置用户和权限
root@zsd-virtual-machine:~# sudo mysql -uroot
mysql> create database zsd;
mysql> create user 'zsd'@'localhost' identified by 'zsd';
mysql> use zsd;
Database changed
mysql> grant all on zsd.* to 'zsd'@'localhost';
Query OK, 0 rows affected (0.00 sec)
3.用PyMySQL操纵MySQL数据库
1.db配置python
(zsdpy1) $ cat dbconfig.py
# coding=utf-8
HOSTNAME = 'localhost'
DATABASE = 'zsd'
USERNAME = 'zsd'
PASSWORD = 'zsd'
DB_URI = 'mysql+pymysql://{}:{}@{}:3306/{}?charset=utf8'.format(
USERNAME, PASSWORD, HOSTNAME, DATABASE)
- HOSTNAME:代表主机名,
- DATABASE:代表建立的数据库名称
- USERNAME:进入mysql数据库的用户名
- PASSWORD:进入mysql的密码
- DB_URI:用于PyMySQL驱动MySQL数据库的uri。
(zsdpy1) $ cat ex_db01.py
# coding=utf-8
import pymysql
from dbconfig import HOSTNAME, DATABASE, USERNAME, PASSWORD
try:
con = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
cur = con.cursor()
cur.execute("SELECT VERSION()")
ver = cur.fetchone()
print ("Database version : %s " % ver)
except MySQLdb.Error as e:
print ("Error %d: %s" % (e.args[0], e.args[1]))
exit(1)
finally:
if con:
con.close()
上述的程序含义:
pymysql.connect
,建立一个MySQL数据库的连接。con.cursor()
,建立一个游标,可以通过SQL语句,操作MySQL数据库的表和数据。cur.execute
,执行一条SQL语句。ver = cur.fetchone()
,返回第一行数据
可以看到,这里是用于返回数据库的版本数据。
运行效果如下:
(zsdpy1) $ python ex_db01.py
Database version : 5.7.29-0ubuntu0.18.04.1
4. CRUD增,删,改,查
(zsdpy1) $ cat curd3x.py
# coding=utf-8
import pymysql
from dbconfig import HOSTNAME, DATABASE, USERNAME, PASSWORD
con = pymysql.connect(HOSTNAME, USERNAME, PASSWORD, DATABASE)
with con as cur:
cur.execute('drop table if exists users')
cur.execute('create table users(Id INT PRIMARY KEY AUTO_INCREMENT, '
'Name VARCHAR(25))')
cur.execute("insert into users(Name) values('xiaoming')")
cur.execute("insert into users(Name) values('wanglang')")
cur.execute('select * from users')
rows = cur.fetchall()
for row in rows:
print (row)
cur.execute('update users set Name=%s where Id=%s', ('ming', 1))
print ('Number of rows updated:', cur.rowcount)
cur = con.cursor(pymysql.cursors.DictCursor)
cur.execute('select * from users')
rows = cur.fetchall()
for row in rows:
print (row['Id'], row['Name'])
程序解释:
唯一的区别可以看到通过调用cur.execute
,实现你想调用的任何SQL语句,如drop table
,insert
,update
,select
,create table
等基础SQL语句。
使用SQLAlchemy
1.安装SQLAlchemy
pip install SQLALchemy
各种数据库驱动接口,案例如下:
pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
实验环境是Python3.6
+pymysql
,所以用的是第一个。
所以上述的dbconfig.py
是一个基础脚本,公用的。
2.原生SQL调用SQLAlchemy
(zsdpy1) $ cat SQLAlchemy_raw_sql3x.py
# coding=utf-8
from sqlalchemy import create_engine
from dbconfig import DB_URI
eng = create_engine(DB_URI)
with eng.connect() as con:
con.execute('drop table if exists users')
con.execute('create table users(Id INT PRIMARY KEY AUTO_INCREMENT, '
'Name VARCHAR(25))')
con.execute("insert into users(name) values('zsd')")
con.execute("insert into users(name) values('lzh')")
rs = con.execute('select * from users')
for row in rs:
print (row)
其中
eng = create_engine(DB_URI)
,建立一个驱动引擎,用于连接MySQL数据库from dbconfig import DB_URI
,调用了dbconfig.py
的变量:DB_URI 的数据.
调用的结果:
可以看到,我插入的两条数据,zsd
和lzh
(zsdpy1)$ python SQLAlchemy_raw_sql3x.py
(1, 'zsd')
(2, 'lzh')
3.ORM
(zsdpy1) $ cat orm_sql.py
# coding=utf-8
from sqlalchemy import create_engine, Column, Integer, String, Sequence
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import and_, or_
from sqlalchemy.orm import sessionmaker
from dbconfig import DB_URI
eng = create_engine(DB_URI)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
# id是主键,且给与一个Sequence,自增
id = Column(Integer, Sequence('user_id_seq'),
primary_key=True, autoincrement=True)
# name是string类型
name = Column(String(50))
# 删除表,个人实验环境,测试用。
Base.metadata.drop_all(bind=eng)
Base.metadata.create_all(bind=eng)
# 建立一个session,提供事务控制。
Session = sessionmaker(bind=eng)
session = Session()
# 添加数据,由于id的主键和自增的。所以合理只需添加name的值。
session.add_all([User(name=username)
for username in ('zsd', 'lzh', 'huke','ly')])
# 数据库的事务提交,commit
session.commit()
# 获得结果的调用方法
def get_result(rs):
print ('-' * 20)
# 变量结果集内的name数据
for user in rs:
print (user.name)
#查询所有的数据
rs = session.query(User).all()
get_result(rs)
# 相当于select * from user where id =2
rs = session.query(User).filter(User.id.in_([2, ]))
get_result(rs)
# 相当于select * from user where id >2 and id <4
rs = session.query(User).filter(and_(User.id > 2, User.id < 4))
get_result(rs)
# 相当于select * from user where id =2 and id = 4
rs = session.query(User).filter(or_(User.id == 2, User.id == 4))
get_result(rs)
# 相当于select * from user where name like '%s%'
rs = session.query(User).filter(User.name.like('%s%'))
get_result(rs)
# 相当于select * from user where name ='zsd'的第一条数据
user = session.query(User).filter_by(name='ly').first()
get_result([user])
效果如下:
(zsdpy1) $ python orm_sql.py
--------------------
zsd
lzh
ly
huke
--------------------
lzh
--------------------
ly
--------------------
lzh
huke
--------------------
zsd
--------------------
ly
运用flask-SQLAlchmey
1.安装Flask-SQLAlchemy
pip install Flask-SQLAlchemy
2.flask-SQLAlchmey的web应用
核心的四个文件如下:
(zsdpy1) $ ls -l
total 16
-rw-r--r-- 1 zsd zsd 552 3月 17 16:24 app_with_sqlalchemy.py
-rw-r--r-- 1 zsd zsd 128 3月 17 16:24 config.py
-rw-r--r-- 1 zsd zsd 198 3月 17 16:24 dbconfig.py
-rw-r--r-- 1 zsd zsd 249 3月 17 16:24 users.py
dbconfig.py
是常用配置文件,上述已经解释过了。
users.py
(zsdpy1) $ cat users.py
# coding=utf-8
from ext import db
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50))
def __init__(self, name):
self.name = name
其中的含义:
from ext import db
ext存放了Flask第三方的扩展,通过db,传导了db.Model
。也体现了ORM
中model
。id
是db模型中的列(Column),Integer
类型.主键,自增id。name
是db模型中的列(Column),name
类型。__init__
基础语法,用于name的初始化。
config.py
(zsdpy1) zsd@zsd-virtual-machine:~/web_develop/chapter3/section3$ cat config.py
# coding=utf-8
from dbconfig import DB_URI
DEBUG = True
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
继承dbconfig
里面的常量,然后可以让flak app去依赖。
app_with_sqlalchemy.py
(zsdpy1) zsd@zsd-virtual-machine:~/web_develop/chapter3/section3$ cat app_with_sqlalchemy.py
# coding=utf-8
from flask import Flask, request, jsonify
from ext import db
from users import User
app = Flask(__name__)
app.config.from_object('config')
db.init_app(app)
with app.app_context():
db.drop_all()
db.create_all()
@app.route('/users', methods=['POST'])
def users():
username = request.form.get('name')
user = User(username)
db.session.add(user)
db.session.commit()
return jsonify({'id': user.id})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
其中程序的含义:
from ext import db
依赖db。app.config.from_object('config')
获取config
中的常量URIapp.app_context()
app发生请求之前,做一些操作,这里是删除user表中所有的数据。@app.route('/users', methods=['POST'])
以post的方式,获取name参数,后面添加user.nam数据到数据库user表中。
3.实验操作
开启flask app应用
(zsdpy1) $ python app_with_sqlalchemy.py
* Serving Flask app "app_with_sqlalchemy" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:9000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 177-062-521
我这里编写了一个http form post的脚本,用于调用这个app应用。
(zsdpy1) zsd@zsd-virtual-machine:~/web_develop/chapter3/section3$ cat http_form.py
# -*- coding:utf-8 -*-
import requests
url = "http://0.0.0.0:9000/users"
data = {"name":"zsd2"}
res = requests.post(url=url,data=data)
print(res.text)
开始调用:
(zsdpy1) zsd@zsd-virtual-machine:~/web_develop/chapter3/section3$ python http_form.py
{
"id": 1
}
可以看到返回了json串,id=1
查看数据库的数据,如下:
mysql> select * from users;
+----+------+
| id | name |
+----+------+
| 1 | zsd2 |
+----+------+
1 row in set (0.00 sec)
发现,zsd2
的数据已经插入,至此,实验结束。enjoy!!!!!
简说Python之flask-SQLAlchmey的web应用的更多相关文章
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
- 【简说Python WEB】数据库
目录 [简说Python WEB]数据库 数据库表 docker安装MySQL Flask-SQLAlchemy操纵MySQL数据库 初始化 定义模型 定义关系 数据库的CRUD操作 创建表 inse ...
- Python flask 基于 Flask 提供 RESTful Web 服务
转载自 http://python.jobbole.com/87118/ 什么是 REST REST 全称是 Representational State Transfer,翻译成中文是『表现层状态转 ...
- 个人学期总结及Python+Flask+MysqL的web建设技术过程
一个学期即将过去,我们也迎来了2018年.这个学期,首次接触了web网站开发建设,不仅是这门课程,还有另外一门用idea的gradle框架来制作网页. 很显然,用python语言的flask框架更加简 ...
- Python+Flask+MysqL的web建设技术过程
一.前言(个人学期总结) 个人总结一下这学期对于Python+Flask+MysqL的web建设技术过程的学习体会,Flask小辣椒框架相对于其他框架而言,更加稳定,不会有莫名其妙的错误,容错性强,运 ...
- Python+Flask+MysqL的web技术建站过程
1.个人学期总结 时间过得飞快,转眼间2017年就要过去.这一年,我学习JSP和Python,哪一门都像一样新的东西,之前从来没有学习过. 这里我就用我学习过的Python和大家分享一下,我是怎么从一 ...
- 【简说Python WEB】Flask-Moment
目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...
- 【简说Python WEB】视图函数操作数据库
目录 [简说Python WEB]视图函数操作数据库 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 ...
- 【简说Python WEB】Web应用部署
目录 [简说Python WEB]Web应用部署 应用层 缓存层 数据层 Gunicorn 的应用 1.安装Gunicorn 2.Gunicorn的启动 Nginx 的应用 1.docker方式部署安 ...
- 使用python的Flask实现一个RESTful API服务器端[翻译]
最近这些年,REST已经成为web services和APIs的标准架构,很多APP的架构基本上是使用RESTful的形式了. 本文将会使用python的Flask框架轻松实现一个RESTful的服务 ...
随机推荐
- 基于ci框架 修改出来了一个带农历的万年历。
1这里没有写model:代码一看就懂,没什么负杂地方,就是麻烦一点. 直接control模块的代码: <?php if ( ! defined('BASEPATH')) exit('No dir ...
- 荼菜的iOS笔记--UIView的几个Block动画
前言:我的第一篇文章荼菜的iOS笔记–Core Animation 核心动画算是比较详细讲了核心动画的用法,但是如你上篇看到的,有时我们只是想实现一些很小的动画,这时再用coreAnimation就会 ...
- MOOC(7)- case依赖、读取json配置文件进行多个接口请求-读取json封装成类(13)
把读取json数据的函数封装成类 # -*- coding: utf-8 -*- # @Time : 2020/2/12 16:44 # @File : do_json_13.py # @Author ...
- python3下scrapy爬虫(第四卷:初步抓取网页内容之抓取网页里的指定数据延展方法)
上卷中我运用创建HtmlXPathSelector 对象进行抓取数据: 现在咱们再试一下其他的方法,先试一下我得最爱XPATH 看下结果: 直接打印出结果了 我现在就正常拼下路径 只求打印结果: 现在 ...
- js 实现排序算法 -- 快速排序(Quick Sort)
原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...
- 4.2英寸的iPhone SE2就要来了!但你还会买单吗?
SE2就要来了!但你还会买单吗?" title="4.2英寸的iPhone SE2就要来了!但你还会买单吗?"> 与其他手机厂商不同,苹果在手机市场的产品策略很&q ...
- 《JavaScript算法》二分查找的思路与代码实现
二分查找的思路 首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步. 如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半 ...
- H5本地离线存储
前言上一篇文件结尾,有同学问我本地存储图片方法,其实本地存储方式有很多,我们打开谷歌浏览器,查看源代码,在resources页签中,有web SQl ,indexedDB等等,我前面文章讲过Local ...
- Catalan母函数法解表达式
- 添加找回鼠标右键新建菜单里的新建office2003/2007/2010文档的简洁方法
鼠标右键新建菜单里的新建office文档丢失了怎么办?我们可以通过一些优化设置软件如优化大师来定制,但更简单的方法是只需要导入相应的注册表设置就行了. 下面即在鼠标右键新建菜单里添加新建office2 ...