【简说Python WEB】数据库
系统环境:Ubuntu 18.04.1 LTS
Python使用的是虚拟环境:virutalenv
Python的版本:Python 3.6.9
【简说Python WEB】数据库
SQL数据库: Oracle,MySQL,PostgreSQL等。
NOSQL数据库:redis,MongoDB等。
关系型数据库,其最大的优点:ACID保证事务完整,确保数据一致性,可靠性。多用于管理软件,财务软件和金融领域。
非关系型数据,通常处理大量的单表数据,简单的业务逻辑场景。在性能上表现了一定的优势。由于其集群和分片特性。
如果以后有时间的话,可以单独讨论数据库这一块。这里主要以介绍使用mysql的docker部署和通过SQLAlchemy来操纵MySQL数据库中的表。
数据库表
roles表
| 字段 | 字段类型 | 注释 |
|---|---|---|
| id | int | 主键,自增id |
| name | varchar(20) | 角色名称 |
users表
| 字段 | 字段类型 | 注释 |
|---|---|---|
| id | int | 主键,自增id |
| username | varchar(20) | 用户名 |
| role-id | int | 角色id,管理角色表 |
roles表对应多个user表的数据,是一对多的关系。
docker安装MySQL
1.docker安装
# snap install docker
CentOS系统可以使用yum install docker
2.docker版本查询
# docker --version
Docker version 18.09.9, build 1752eb3
3.拉取MySQL官方镜像
# docker pull mysql
4.查看目前的镜像
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 9b51d9275906 2 weeks ago 547MB
5.运行mysql镜像
docker run -p 3306:3306 --name zsdmysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
上述命令的参数,有如下含义:
--name指定了你要取的名字。-p对应,需要映射出来的端口。比如:3306:3306,意识表示为zsdmysql的容器里面的3306端口对应我外面这个虚拟机的3306端口。-e是mysql的命令,设置root的密码为123456-d是运行的镜像,这里是mysql容器镜像
6.查看目前运行的容器
root@ubuntudoc:~# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3958ab15ea05 mysql "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp zsdmysql
7.进入MySQL
root@ubuntudoc:~# docker exec -it zsdmysql bash
### 下述代表容器里面的情况了
root@3958ab15ea05:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
8.MySQL数据的一些操作:
mysql> create database zsd;
mysql> create user 'zsd'@'localhost' identified by 'zsd';
mysql> create user 'zsd'@'172.30.200.252' identified by 'zsd';
mysql> use zsd;
Database changed
mysql> grant all on zsd.* to 'zsd'@'localhost';
mysql> grant all on zsd.* to 'zsd'@'172.30.200.252';
Flask-SQLAlchemy操纵MySQL数据库
SQLAlchemy是一个关系型数据库的框架。
代码树:
.
├── app.py
├── dbconfig.py
安装Flask-SQLAlchemy
pip install Flask-SQLAlchemy
Flask-SQLAlchemy 各种数据库驱动接口,url如下:
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使用pymysql,安装pytmysql
pip install PyMySQL
初始化
dbconfg.py 配置文件:
# coding=utf-8
HOSTNAME = '172.30.200.252'
DATABASE = 'zsd'
USERNAME = 'zsd'
PASSWORD = 'zsd'
DB_URI = 'mysql+pymysql://{}:{}@{}:3306/{}?charset=utf8'.format(
USERNAME, PASSWORD, HOSTNAME, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
app.py初始化实例
from flask_sqlalchemy import SQLAlchemy
app.config.from_object('dbconfig')
db = SQLAlchemy(app)
定义模型
app.py的视图代码
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
def __repr__(self):
return '<Role %r>' % self.name
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
def __repr__(self):
return '<User %r>' % self.username
定义关系
app.py关系代码:
class Role(db.Model):
#..
users = db.relationship('User', backref='role')
class User(db.Model):
#..
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
可以看到,User表中,定义了一个外键roles.id'。
而Role表,定义了db.relationship。意思可以认为,一个Role可以对应多个User实例。代表了一对多的意思
数据库的CRUD操作
创建表
(zsdpy1)$ flask shell
>>> from app import db
>>> db.create_all()
这里,就会在MySQL数据中直接创建两张表,如下:
mysql> desc zsd.users;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| username | varchar(64) | YES | UNI | NULL | |
| role_id | int | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+----------------+
mysql> desc zsd.roles;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(64) | YES | UNI | NULL | |
+-------+-------------+------+-----+---------+----------------+
也可以直接删除所有旧表,重置上述表,如下:
>>> db.drop_all()
>>> db.create_all()
上述操作,可是删除ORM映射的所有表和数据,必须谨慎,谨慎再谨慎!!!!
insert数据
插入一些用户的角色:
>>> from app import Role,User
>>> admin_role= Role(name='管理员')
>>> user_role= Role(name='普通用户')
>>> zsd = User(username='盛东',role=admin_role)
>>> huke =User(username='胡轲',role=user_role)
数据库是通过session交互的,如下:
>>> db.session.add(admin_role)
>>> db.session.add(user_role)
>>> db.session.add(zsd)
>>> db.session.add(huke)
亦或者,全部插入:
>>> db.session.add_all(admin_role,user_role,zsd,huke)
事务提交
>>> db.session.commit()
查看角色数据
>>> Role.query.all()
[<Role '普通用户'>, <Role '管理员'>]
update数据
>>> rs = db.session.query(User).filter_by(username='盛东').first()
>>> print(rs)
<User '盛东'>
>>> rs.username ='盛东2'
>>> db.session.commit()
查看数据库,数据修改为盛东2
mysql> select * from users;
+----+----------+---------+
| id | username | role_id |
+----+----------+---------+
| 1 | 盛东2 | 1 |
| 2 | 胡轲 | 2 |
+----+----------+---------+
delete数据
>>> rs = db.session.query(User).filter_by(username='盛东2').first()
>>> db.session.delete(rs)
>>> db.session.commit()
查询数据
>>> Role.query.all()
[<Role '普通用户'>, <Role '管理员'>]
>>> User.query.all()
[<User '胡轲'>]
>>> User.query.filter_by(username='胡轲').first()
<User '胡轲'>
错误
有如下错误:
RuntimeError: cryptography is required for sha256_password or caching_sha2_password
需要安装:
pip install cryptography
【简说Python WEB】数据库的更多相关文章
- 【简说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 WEB】Flask-Moment
目录 [简说Python WEB]Flask-Moment 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...
- 【简说Python WEB】Flask应用的文件结构
目录 [简说Python WEB]Flask应用的文件结构 1.文件结构的目录 2.配置程序--config.py 3.app应用包 4.剥离出来的email.py 5.蓝本(BLueprint)的应 ...
- 【简说Python WEB】flask-mail电子邮件
目录 flask-mail flask shell发送邮件 系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6 ...
- 【简说Python WEB】flask-mail电子邮件异步Asynchronous
系统环境:Ubuntu 18.04.1 LTS Python使用的是虚拟环境:virutalenv Python的版本:Python 3.6.9 flask-mail电子邮件异步Asynchronou ...
- 【简说Python WEB】pyechart在flask中的应用
个人笔记总结,可读性不高.只为自己总结用.怕日后忘记. 这里用到了tushare,pandas等python组件. pyechart的案例 c = ( Bar() .add_xaxis([" ...
- python web开发——django学习(一)第一个连接mysql数据库django网站运行成功
1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message 4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表 6.运行 ...
- Python Web 开发的十个框架【转载】
Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...
随机推荐
- linux公社大量免费的在线android资料
2011年linux数据库的android在线分享 linux公社:开源公社 本文撰写:杨凯专属频道 下载如需密码,详见博客案例:点击我去查看密码 2011年9月12日 21: ...
- DJI大疆创新招聘-自动化测试工程师
工作地点:深圳 简历发送:sue.li@dji.com 工作职责: 1. 参与自动化测试的设计和开发,参与需求分析和评审,评估合理性和完备性: 任职资格: 1. 本科及以上学历,计算机或软件工程相关专 ...
- Python爬虫-百度模拟登录(二)
上一篇-Python爬虫-百度模拟登录(一) 接上一篇的继续 参数 codestring codestring jxG9506c1811b44e2fd0220153643013f7e6b1898075 ...
- C++走向远洋——39(指向学生类的指针)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:zhizhen.cpp * 作者:常轩 * 微信公众号:Worl ...
- git问题待更新
git pull failed 错误解决 情况: 刚开始的项目,需要创建一个项目,然后pull从远端的项目,创建分支dev,然后从dev分支开始拉取远端的代码 出现错误,说git pull faile ...
- iOS 开发富文本之TTTAttributedLabel 在某个特定位置的文字添加跳转,下划线,修改字体大小,颜色
@property(nonatomic , strong) TTTAttributedLabel * ttLabel; @property(nonatomic , strong) NSRange li ...
- 前端每日实战:151# 视频演示如何用纯 CSS 创作超能陆战队的大白
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ReGRaO 可交互视频 此视频是可 ...
- 进阶之路 | 奇妙的Thread之旅
前言 本文已经收录到我的Github个人博客,欢迎大佬们光临寒舍: 我的GIthub博客 需要已经具备的知识: Thread的基本概念及使用 AsyncTask的基本概念及使用 学习清单: 线程概述 ...
- npm项目创建初始过程详解
npm install 就是安装模块,npm run dev 就是执行npm script中的命令.当我们执行npm命令的时候,它到哪里去找,这就要说到每个node项目中都有的核心文件package ...
- CJSON的封装API
为了更方便使用C的JSON库,对其进行了一层封装. H文件: #ifndef __JSONHELPER__ #define __JSONHELPER__ #ifdef __cplusplus exte ...