测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作
flask-SQLAlchemy是在原生SQLAlchemy的基础之上做了一层封装,安装flask-SQLAlchemy会自动安装SQLAlchemy
安装


传统的sql建表建字段

通过flask-SQLAlchemy建表建字段
用法:声明和初始化一系列的配置

flask-SQLAlchemy建表建字段
db.String() 整形
db.Integer() 字符串
db.TEXT() 文本
db.DateTime() 日期时间
db.Float() 浮点
db.Boolean() 布尔
db.PickleType() pickle序列对象
db.LargeBinary() 大二进制对象

触发

现在状态是没有数据库的

访问

数据库已生成

打开,字段创建成功


from datetime import datetime
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 初始化app """
SQLAlchemy_DATABASE_URI:指定数据库地址,SQLAlchemy的固定字段
sqlite: sqlite:///数据库路径/数据库.db
基本形式:
mysql/oracle+驱动://用户名:密码@主机:端口/数据库
mysql数据库:mysql://root:123@127.0.0.1:3306/my_db
"""
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/test.db' # 声明数据库类型和地址
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True # 跟踪改变
app.config['SQLALCHEMY_ECHO'] = True # 打印对应的sql,此操作用sql是怎么样的
db = SQLAlchemy(app) # 创建数据库核心对象并把数据库和app关联起来
"""
sql实现建表建字段:
crate table User(
id INTEGER Primary Key,
username TEXT,
email TEXT,
password TEXT,
create_time DATETIME
);
""" # SQLAlchemy实现建表建字段
class User(db.Model):
__tablename__ = 'user' # 表名
id = db.Column(db.Integer, primary_key=True) # id字段,integer类型,主键
username = db.Column(db.String(50), unique=True) # 50个字符长度 unique=True 唯一
email = db.Column(db.String(200), unique=True)
password = db.Column(db.String(100))
create_time = db.Column(db.DateTime, default=datetime.now) # 给个默认值为datetime.now def __init__(self, username, email, password, create_time=datetime.now()):
self.username = username
self.email = email
self.password = password
self.create_time = create_time def __repr__(self):
return f'用户:{self.id}, {self.username}, {self.password}, {self.email}' # 访问接口时,创建数据库
@app.route('/db/')
def initialize_db():
db.create_all() # 执行建表操作
return 'ok' if __name__ == '__main__':
app.run(
debug=True
)
插入数据


查询所有


查询一条

改:


from main import * # 增
u = User('tom1', 'tom@tom.com', '123456')
db.session.add(u)
db.session.commit() u2 = User('jerry1', 'jerry@jerry.com', '123456')
db.session.add(u2)
db.session.commit() # 查询所有
for u in db.session.query(User).all():
print(u) # 查询一条
user = db.session.query(User).filter(User.id == 2).one()
print(user) # 改
user = db.session.query(User).filter(User.id == 2).one()
user.password = '654321'
db.session.commit()
渲染到前台页面

# 展示所有用户信息
@app.route('/users/')
def user_list():
users = db.session.query(User).all()
print(users)
return render_template('user-list.html', users=users)
user-list.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户信息</title>
</head>
<body>
<h2>用户信息</h2>
<table border="1">
<tr>
<td>ID</td>
<td>姓名</td>
<td>邮箱</td>
<td>密码</td>
<td>创建时间</td>
</tr>
{% for user in users %}
<tr>
<td>{{ user.id }}</td>
<td>{{ user.username }}</td>
<td>{{ user.email }}</td>
<td>{{ user.password }}</td>
<td>{{ user.create_time }}</td>
</tr>
{% endfor %}
</table> </body>
</html>

测开之路一百四十二:ORM框架之SQLAlchemy建库、建表、数据库操作的更多相关文章
- 测开之路一百四十三:ORM框架之SQLAlchemy模型及表创建
基于前一篇内容,可以使用模型的结构 目录结构 main,入口层 from flask import Flaskfrom flask_sqlalchemy import SQLAlchemy app = ...
- 测开之路一百五十二:基于jquery的ajax实现之load、get、ajax
ajax除了用原生的js实现之外,也可以使用jquery实现,而且用jquery更方便 看一个简单的示例,保留上一篇的content路由和html,实现上一篇一样的功能,点击获取内容,局部刷新 准备一 ...
- 测开之路一百四十九:jinja2模板之宏
jinja2是python的模板引擎, 在写python web使用的过程中,macro可以节省大量的代码 比如上一篇的渲染页面 <!DOCTYPE html><html lang= ...
- 测开之路一百四十八:WTForms表单验证
使用WTForms表单验证,可以在数据建模时就设置验证信息和错误提示 创建模型时,设置验证内容,如必填.格式.长度 from flask_wtf import Formfrom wtforms imp ...
- 测开之路一百四十六:WTForms之表单应用
WTForms主要是两个功能:1.生成HTML标签 2.对数据格式进行验证 官网:https://wtforms.readthedocs.io/en/stable/ 这篇介绍用wtform生成htm ...
- 测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除
实现在页面上点击展示页就展示内容,点击新增页就触发新增功能 项目结构 admin.__init__ from flask import Blueprint admin = Blueprint('adm ...
- 测开之路一百四十四:ORM之SQLAlchemy查询
在上一篇的基础上,插入数据 查询 Department.query.all() # 用表对象查db.session.query(Department).all() # 用db对象查 查询前两条,直接p ...
- 测开之路一百一十二:bootstrap按钮
bootstrap按钮 引入bootstrap和jquery 普通按钮和bootstrap风格按钮 调整大小 块级按钮 禁用按钮 disabled 按钮分组 分页按钮
- 测开之路一百五十五:jquery-validation前台数据验证
前面做的wtform验证是服务器端的验证,需要把数据传输到服务器,服务器验证后再吧结果传输到前端,网络慢的时候,用户体验不好,所以需要前端验证,且后端验证不能少 传统的js或者jquery如果要验证信 ...
随机推荐
- 20180115-Xcode创建多个工程协同开发
今天研究了一下在Xcode中创建多个工程,达到模块化的目的的同时,实现多个相似项目的协同开发,最主要的是可以实现多工程连编.项目的效果如下: 接下来创建一个这样的项目,以及他们之间的通信 1.建一个文 ...
- NoSQL与其常见的产品
一. 什么是NoSQL NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",它是一种非关系型数据库. 二. 为什么要有NoSQL 在现代的计算系统上每 ...
- php引用 & 详解
在PHP 中引用的意思是:不同的名字访问同一个变量内容. 与C语言中的指针是有差别的.C语言中的指针里面存储的是变量的内容在内存中存放的地址 变量的引用 $a = 222; $b = &$a; ...
- java.lang.IllegalStateException: No output folder
将正在正常运行的tomcat打包(使用tar -zcvf命令打的包),然后放到其他服务器上使用非root用户解压(使用tar -zxvf命令)配置好之后,启动tomcat后报错如下 HTTP Stat ...
- 如何修改Git已提交的日志
情况一:最后一次提交且未push 执行以下命令: git commit --amend git会打开$EDITOR编辑器,它会加载这次提交的日志,这样我们就可以在上面编辑,编辑后保存即完成此次的修改. ...
- 牛客练习赛47 A DongDong破密码 (异或性质,递推)
链接:https://ac.nowcoder.com/acm/contest/904/A 来源:牛客网 DongDong破密码 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1310 ...
- @ResponseBody 注解是什么意思?
1. @ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据 ...
- Ubuntu安装DroidCamX网络摄像头
1.安装依赖项 sudo apt-get install gcc make linux-headers-`uname -r` 2.安装 cd /tmp/ bits=`getconf LONG_BIT` ...
- 【HDU2089】不要62
题目大意:求区间 [n,m] 中数位不包含 4 和 62 的数字的个数. 题解:数位dp. 预处理出 \(f[i][j]\) 表示 i 位数字中以 j 为第一位的满足条件的数字个数. 对于统计答案来说 ...
- 基于python的知乎开源爬虫 zhihu
今天在无意之中发现了一个知乎的开源爬虫,是基于Python的,名字叫zhihu_oauth,看了一下在github上面star数还挺多的,貌似文档也挺详细的,于是就稍微研究了一下.发现果然很好用啊.就 ...