網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Flask數(shù)據(jù)模型和連接數(shù)據(jù)庫(kù)
flask是基于MTV的結(jié)構(gòu),其中M指的就是模型,即數(shù)據(jù)模型,在項(xiàng)目中對(duì)應(yīng)的是數(shù)據(jù)庫(kù)。flask與數(shù)據(jù)庫(kù)建立聯(lián)系有很多方法,但一般分為兩種,一種是使用pymsql對(duì)數(shù)據(jù)庫(kù)建立連接;還有一種是ORM映射的方式(基于pymysql),這種方式常用于web開(kāi)發(fā)。以對(duì)象的形式與數(shù)據(jù)庫(kù)表做映射,方便對(duì)象在頁(yè)面中顯示。下面紀(jì)錄以mysql和orm方式連接數(shù)據(jù)庫(kù)。
一、安裝
準(zhǔn)備工作,安裝一下庫(kù):
pip3 install pymysql 建公路
pip3 install flask-sqlalchemy 實(shí)現(xiàn)ORM映射
pip3 install flask-migrate 發(fā)布命令工具
二、配置數(shù)據(jù)庫(kù)連接、創(chuàng)建模型類
步驟:
(1) 配置數(shù)據(jù)庫(kù)的連接路徑
# mysql+pymysql://user:password@hostip:port/databasename
# 數(shù)據(jù)庫(kù)+pymysql://用戶名:密碼@主機(jī)ip:端口/數(shù)據(jù)庫(kù)名
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1:3306/flaskdemo'
(2) flask-sqlalchemy的搭建:在apps包下創(chuàng)建包ext(第三方庫(kù)的配置通常建個(gè)ext文件夾存放),用于存放與數(shù)據(jù)庫(kù)有關(guān)的代碼,在__init__.py中添加:
db = SQLAlchemy() ---->必須跟app聯(lián)系
在apps/init.py文件(這里我將啟動(dòng)app和app初始化分開(kāi)了,此處的__init__是app的初始化)下與app建立聯(lián)系:
def create_app():
....
# 跟app聯(lián)系
db.init_app(app)
return app
(3) 創(chuàng)建模型:models.py,模型就是類,經(jīng)常稱作模型類
class User(db.Model): ------> user表
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(15), nullable=False)
password = db.Column(db.String(12), nullable=False)
phone = db.Column(db.String(11), unique=True)
rdatetime = db.Column(db.DateTime, default=datetime.now)
常見(jiàn)的數(shù)據(jù)類型:
Integer 整型
String(size) 字符串類型,務(wù)必指定大小
Text 長(zhǎng)文本類型
DateTime 日期時(shí)間
Float 浮點(diǎn)類型
Boolean 布爾類型
PickleType 存儲(chǔ)pickle類型 主要跟序列化有關(guān)
LargeBinary 存儲(chǔ)大的二進(jìn)制類型
可選的:
primary_key=True 主鍵
autoincrement=True 自增
nullable=False 不允許為空
unique=True 唯一
default=datetime.now 默認(rèn)值 可以設(shè)置成當(dāng)前系統(tǒng)時(shí)間或者其他的值
三、使用命令創(chuàng)建數(shù)據(jù)庫(kù)表
a. 在app.py 中導(dǎo)入模型:from apps.user.models import User —》讓模型與app關(guān)聯(lián)
b. 在終端使用命令:db 建立數(shù)據(jù)庫(kù)/更新數(shù)據(jù)庫(kù)
flask db init -----》 產(chǎn)生一個(gè)文件夾migrations
flask db migrate -----> 自動(dòng)產(chǎn)生了一個(gè)版本文件
flask db upgrade ------> 同步,完成數(shù)據(jù)庫(kù)表創(chuàng)建
項(xiàng)目結(jié)構(gòu)
| ---apps
| ---ext
| ---migrations flask db init 只需要init一次
|---versions 版本文件夾
|---71edde7ee937_.py ---》 flask db migrate 遷移
|---cc0dca61130f_.py
flask db upgrade 同步
flask db downgrade 降級(jí)
四、以注冊(cè)為例
1.創(chuàng)建app、migrate(綁定app、數(shù)據(jù)庫(kù)),app.run啟動(dòng)入口
2.apps文件下__init__.py文件初始化app配置
3.數(shù)據(jù)庫(kù)配置
4.創(chuàng)建模型類
5.通過(guò)命令創(chuàng)建數(shù)據(jù)庫(kù)表
flask db init -----》 產(chǎn)生一個(gè)文件夾migrations
flask db migrate -----> 自動(dòng)產(chǎn)生了一個(gè)版本文件
flask db upgrade ------> 同步,完成數(shù)據(jù)庫(kù)表創(chuàng)建
此刻在pycharm的數(shù)據(jù)庫(kù)視圖中可以看到創(chuàng)建好的數(shù)據(jù)庫(kù)表
6.編寫(xiě)注冊(cè)邏輯(視圖)
# 用戶注冊(cè)
@user_bp.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
repassword = request.form.get('repassword')
phone = request.form.get('phone')
email = request.form.get('email')
if password == repassword:
# 注冊(cè)用戶
user = User()
user.username = username
# 自定義加密:new_password = hashlib.sha256(password.encode('utf-8')).hexdigest()
# 使用自帶的函數(shù)實(shí)現(xiàn)加密:generate_password_hash
user.password = generate_password_hash(password)
print(len(user.password))
user.phone = phone
user.email = email
# 添加并提交
db.session.add(user)
db.session.commit()
return redirect(url_for('user.index'))
return render_template('user/register.html')
7.編寫(xiě)模板即html頁(yè)面即可實(shí)現(xiàn)簡(jiǎn)單的注冊(cè)功能,實(shí)現(xiàn)MTV的整合
原文鏈接:https://blog.csdn.net/victory_CEO/article/details/127667238
相關(guān)推薦
- 2022-03-31 React-Router6版本的更新引起的路由用法變化_React
- 2022-10-06 C++?pimpl機(jī)制詳細(xì)講解_C 語(yǔ)言
- 2023-07-16 oracle 創(chuàng)建存儲(chǔ)過(guò)程
- 2022-04-28 SpringBoot?整合mongoDB并自定義連接池的示例代碼_MongoDB
- 2023-04-07 解決jest處理es模塊示例詳解_React
- 2022-09-05 python使用pip成功導(dǎo)入庫(kù)后還是報(bào)錯(cuò)的解決方法(針對(duì)vscode)_python
- 2023-01-03 c語(yǔ)言malloc函數(shù)的用法示例和意義_C 語(yǔ)言
- 2022-10-20 Swift協(xié)議Protocol介紹_Swift
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支