【简说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甚至还 ...
随机推荐
- python基础 生成器 迭代器
列表生成式: a=[1,2,3] print a b=[i*2 for i in range(10)] #i循环10次,每一个i的值乘2就是列表中的值.列表生成式 print b >>[1 ...
- APP内计费规范出台 手游乱收费现象能被遏制?
手游乱收费现象能被遏制?" title="APP内计费规范出台 手游乱收费现象能被遏制?"> 在一个混乱.无秩序的环境中竞争,虽然有可能不择手段地获取更多的利益,但 ...
- MyBatis连接MySQL8配置
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</a ...
- WWW 2015:一个神奇的会议
2015:一个神奇的会议" title="WWW 2015:一个神奇的会议"> 作者:微软亚洲研究院研究员 袁进辉 WWW 2015(24th Internatio ...
- Hihocoder1456 Rikka with Lattice
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:勇太有一个$n times m$的点阵,他想要从这$n times m$个点中选出三个点 ${A,B,C}$,满足 ...
- CentOS7搭建FTP Server
本文主要记录CentOS下FTP Server的安装和配置流程. 安装vsftpd yum install -y vsftpd 启动vsftpd service vsftpd start 运行下面的命 ...
- 银行储蓄程序(C++,simple)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Nginx 配置GeoIP2 禁止访问,并允许添加白名单过滤访问设置
配置环境:Centos 7.6 + Tengine 2.3.2 GeoIP2 下载地址:https://dev.maxmind.com/geoip/geoip2/geolite2/ 1. Nginx ...
- Grafana+Prometheus监控mysql性能
#cmd /usr/local 今天讲一下如何监控服务器中的mysql数据库的性能 一.数据库操作 1.mysql启动 #service mysqld start #启动数据库 #service my ...
- iOS 使用系统的UITabBarController 修改展示的图片大小
1. 设置TabBarItem图片的大小 1 - (void)configurationAppTabBarAndNavigationBar { // 选中的item普通状态图片的大小 UIImage ...