国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Flask狼書筆記 | 05_數(shù)據(jù)庫

這篇具有很好參考價值的文章主要介紹了Flask狼書筆記 | 05_數(shù)據(jù)庫。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Flask狼書筆記 | 05_數(shù)據(jù)庫,學(xué)而時習(xí)之,flask,筆記,數(shù)據(jù)庫,python

5 數(shù)據(jù)庫

這一章學(xué)習(xí)如何在Python中使用DBMS(數(shù)據(jù)庫管理系統(tǒng)),來對數(shù)據(jù)庫進(jìn)行管理和操作。本書使用SQLite作為示例。

:按下Ctrl+F5,或Shift+F5可以清除瀏覽器緩存。

5.1 數(shù)據(jù)庫的分類

分為SQL(Structured Query Language)數(shù)據(jù)庫和NoSQL(Not Only SQL)數(shù)據(jù)庫。

  • SQL:稍顯復(fù)雜,但不容易出錯,可以適應(yīng)大部分場景。
  • NoSQL:靈活,效率高,可擴(kuò)展性好等。
    • 1、文檔存儲:使用類json格式來表示數(shù)據(jù)
    • 2、鍵值對存儲:通過鍵來存取數(shù)據(jù),讀寫很快,常作為緩存使用。

5.2 ORM

ORM:Object-Relational Mapping,對象關(guān)系映射。

作用

  • 處理查詢參數(shù)的轉(zhuǎn)義,防止注入。
  • 為不同的DBMS提供統(tǒng)一的接口。
  • 能直接使用Python操作數(shù)據(jù)庫,不需要寫SQL語句。

ORM實現(xiàn)了三層映射關(guān)系:表 --> Python類,字段 --> 類屬性,記錄 --> 類實例。

# 定義表
from foo_orm import Model, Column, String 
class Contact(Model):
    __tablename__ = 'contacts'
    name = Column(String(100), nullable=False)
    
# 插入記錄
contact = Contact(name="zhang san")

5.3 使用Flask_SQLAlchemy

1、連接數(shù)據(jù)庫

首先連接數(shù)據(jù)庫需要指定URI(Uniform Resource Identifier,統(tǒng)一資源標(biāo)識符),URL(統(tǒng)一資源定位符)是它的子集。

常用的數(shù)據(jù)庫URI格式:(p143)

SQLite是基于文件的DBMS,不需要數(shù)據(jù)庫服務(wù)器,只需要指定數(shù)據(jù)庫文件的絕對路徑。配置數(shù)據(jù)庫URI的代碼如下:

from flask import Flask
import os
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
t = app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///' + os.path.join(app.root_path, 'data.db'))
db = SQLAlchemy(app)

print(t)
print(db)

運行輸出:

sqlite:///D:\code_all\gitCode\helloflask_learn\數(shù)據(jù)庫\data.db
<SQLAlchemy>

補充os.getenv是一個Python標(biāo)準(zhǔn)庫函數(shù),它用于從環(huán)境變量中獲取指定的值。這個函數(shù)的第一個參數(shù)是要查找的環(huán)境變量名稱,第二個參數(shù)是默認(rèn)值,如果未找到指定的環(huán)境變量,則返回這個默認(rèn)值。

2、定義數(shù)據(jù)庫模型

模型類繼承自SQLAlchemy提供的db.Model基類,表的字段由db.Column類的實例表示。

SQLAlchemy常用的字段類型:(p144)

常用的字段參數(shù):(p145)

class Note(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.Text)
  • 表名稱會根據(jù)模型的類名稱自動生成,可用__tablename__屬性指定。

  • 字段名默認(rèn)為類屬性名,看用name關(guān)鍵字參數(shù)指定。

3、創(chuàng)建數(shù)據(jù)庫和表

db.create_all()

可以查看模型對象的建表SQL語句:

from app import Note
from sqlalchemy.schema import CreateTable
print(CreateTable(Note.__table__))

改動模型類后,再次調(diào)用create_all()不會更新表結(jié)構(gòu)??梢哉{(diào)用drop_all()方法刪除數(shù)據(jù)庫和表,然后重建。

可以自定義一個flaks命令完成數(shù)據(jù)庫的創(chuàng)建工作,對于sqlite創(chuàng)建成功后會生成一個數(shù)據(jù)庫文件,如data.db。

import click
@app.cli.command()
def initdb():
    db.create_all()
    click.echo('Initialized database')

5.4 數(shù)據(jù)庫操作

SQLAlchemy使用數(shù)據(jù)庫會話(也稱為事務(wù))來管理數(shù)據(jù)庫操作,會話代表一個臨時存儲區(qū),對會話對象調(diào)用commit()方法時,改動才被提交到數(shù)據(jù)庫。調(diào)用rollback()方法可以撤銷會話中未提交的改動。

1、CRUD

即Create、Read、Update、Delete。

  • Create
note = Note(body='hello, world')
db.session.add(note)
db.session.commit()

通過add_all()可以一次提交一個列表。

  • Read
<模型類>.query.<過濾方法>.<查詢方法>
Note.query.filter(Note.body=='hello, world').first

Query對象調(diào)用過濾方法的返回值仍然是一個Query對象,就像SQL的操作對象和返回結(jié)果都是表。查詢方法返回的是模型類實例。

常用的SQLAchemy查詢方法:(p148) all(),first(), count()paginate()get(ident)

常用過濾方法:(p150) filter(),filter_by(),order_by(),limit()group_by()

常用查詢操作符:(p150) LIKE,IN,NOT IN,AND,OR等。

  • Update
note = Note.query.get(2)
note.body = 'hello, flask'
db.session.commit()
  • Delete
note = Note.query.get(2)
db.session.delete(note)
db.session.commit()

2、在視圖函數(shù)里操作數(shù)據(jù)庫

與在python shell中基本一致。

5.5 定義關(guān)系

1、配置Python Shell上下文

使用app.shell_context_processor裝飾器注冊一個shell上下文處理函數(shù),返回包含變量和變量值的字典。

@app.shell_context_processor
def make_shell_context():
    return dict(db=db, Note=Note)

2、一對多關(guān)系

定義一對多關(guān)系包含兩個部分:定義外鍵,和定義關(guān)系屬性。其中關(guān)系屬性相當(dāng)于一個快捷查詢,不會作為字段被寫入到數(shù)據(jù)庫中。下面的關(guān)系屬性articles會返回該作者所有文章的記錄列表。

class Author(db.Model):
    ...
    articles = db.relationship('Article')
    
class Article(db.Model):
    ...
    author_id = db.Column(db.Integer, db.ForeignKey('athor.id'))

可以在兩側(cè)都定義一個關(guān)系屬性,稱為雙向關(guān)系,需要用到back_populates關(guān)鍵字參數(shù),值為另一側(cè)的關(guān)系屬性名。

class Author(db.Model):
    ...
    articles = db.relationship('Article', back_populates='author')

class Article(db.Model):
    ...
    author_id = db.Column(db.Integer, db.ForeignKey('athor.id'))
    author = db.relationship('Author', back_populates='articles')

可以使用backref簡化關(guān)系定義,(p163)

疑惑:為什么要手動在兩側(cè)都指定反向引用,而不是添加了外鍵屬性之后就自動的呢?是采用了數(shù)據(jù)庫中的索引嗎?

定義關(guān)系后,建立關(guān)系有兩種方式,一種是為外鍵字段賦值,另一種是通過操作關(guān)系屬性。

# 為外鍵字段賦值
article_A.author_id = 1
# 操作關(guān)系屬性: append, remove, pop
Mike.articles.append(article_A)

常用關(guān)系函數(shù)參數(shù):p161

常用關(guān)系記錄加載方式:p161

3、一對一關(guān)系

實際上是在通過建立一對多關(guān)系的雙向關(guān)系的基礎(chǔ)上轉(zhuǎn)化而來,只是在原來”一“的一方設(shè)置userlist=False,將集合屬性變?yōu)闃?biāo)量屬性。此后,無法再使用列表語義操作,如append方法。

class Contry(db.Model):
    ...
    capital = db.relationship('Capital', uselist=False)
class Capital(db.Model):
    ...
    contry_id = db.Column(db.Integer, db.ForeignKey('country.id'))
    contry = db.relationship('Country')

4、多對多關(guān)系

一對多關(guān)系中在“多”的一方存放外鍵,則“多”一方的每條記錄只能有一條關(guān)系。我們可以單獨創(chuàng)建一個關(guān)聯(lián)表(db.Table)來存儲外鍵,表示多對多關(guān)系。使用secondary參數(shù)來指定關(guān)聯(lián)表。

association_table = db.Table(
    'association',
	db.Column('student_id', db.Integer, db.ForeignKey('student.id')),
	db.Column('teacher_id', db.Integer, db.ForeignKey('teacher.id')))

class Student(db.Model):
    ...
    teachers = db.relationship('Teacher', secondary=association_table, back_populates='students')

class Teacher(db.Model):
    ...
    students = db.relationship('Student', secondary=association_table, back_populates='teachers')    

5.6 更新數(shù)據(jù)庫表

1、重新生成表

方法很簡單,但缺點是會丟失原來的所有數(shù)據(jù)。

db.drop_all()
db.create_all()

2、使用Flask-Migrate遷移(p169)

可以保留數(shù)據(jù)庫中原有的數(shù)據(jù)。自動生成的遷移命令不一定可靠,必要時檢查一下。

flask db init # 創(chuàng)建遷移環(huán)境
flask db migrate # 生成遷移腳本
flask db upgrade # 應(yīng)用遷移
flask db downgrade # 撤銷一次遷移

5.7 數(shù)據(jù)庫進(jìn)階

1、級聯(lián)操作(p172)

relationship方法可以配置cascade參數(shù),所有可用值為save-update,merge,refresh-expire,expunge,delete。默認(rèn)值為save-update,merge。

class Post(db.Model):
    ...
	comments = db.relationship(..., cascade='save-update, merge, delete')
  • save-updatedb.session.add()將Post對象添加到數(shù)據(jù)庫會話時,相關(guān)的Comment對象也會被添加到數(shù)據(jù)庫會話。

  • delete:Post記錄被刪除時,相關(guān)的Comment記錄也會被刪除。

  • delete-orphan:Post與Comment記錄解除關(guān)系操作時,相應(yīng)的Comment記錄會被刪除。

  • all:包含除了delete-orphan之外的所有可用值。

2、事件監(jiān)聽(p176)

在Flask中有請求回調(diào)函數(shù),而SQLAlchemy也提供了listens_for()裝飾器來注冊事件回調(diào)函數(shù)。裝飾器接受兩個參數(shù),target表示監(jiān)聽的對象,identifier表示被監(jiān)聽事件的類型。被注冊的監(jiān)聽函數(shù)需要接收對應(yīng)事件方法的所有參數(shù)。

疑惑:“事件方法”指什么?怎么知道它有哪些參數(shù)?

class Draft(db.Model):
    ...
    edit_time = ...
    
@db.event.listens_for(Draft.body, 'set', named=True)
def increment_edit_time(**kwargs):
    if kwargs['target'].edit_time is not None:
        kwargs['target'].edit_time += 1

設(shè)置named參數(shù)為True可以使用kwargs接收所有參數(shù)(不知道為啥)。kwargs中的target參數(shù)表示觸發(fā)事件的模型類實例。


小結(jié)

SQLAlchemy入門教程:(p177)http://docs.sqlalchemy.org/en/latest/orm/tutorial.html

數(shù)據(jù)庫這一章我看得有點拖拉,正值開學(xué),可能需要好些天才能找回學(xué)習(xí)狀態(tài)。大部分東西我還是之前都有所了解,因此看得比較流暢。在最近開發(fā)自己的玩具程序的過程中,數(shù)據(jù)庫這一環(huán)節(jié)可給我制造了不少麻煩(特別是配環(huán)境),它在我眼里的黑盒程度又比較高,書中說到本章只是一個簡單的介紹,不過暫時于我也夠用了。文章來源地址http://www.zghlxwxcb.cn/news/detail-708657.html

到了這里,關(guān)于Flask狼書筆記 | 05_數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Flask狼書筆記 | 08_個人博客(下)

    Flask狼書筆記 | 08_個人博客(下)

    1、安全存儲密碼 密碼不要以明文的形式直接存儲在數(shù)據(jù)庫中,以防被攻擊者盜取、泄露。一般的做法是, 不存儲密碼本身,而存儲通過密碼生成的散列值 。(但密碼仍然可能在傳輸過程中被截獲) 疑惑 :加鹽散列值、密碼擴(kuò)展,是什么樣的作用原理? 2、創(chuàng)建管理員用戶

    2024年02月07日
    瀏覽(15)
  • Flask狼書筆記 | 07_留言板

    Flask狼書筆記 | 07_留言板

    這是一個簡單的程序,涉及到的大部分是之前所學(xué)習(xí)到的基礎(chǔ)知識。新涉及的python包: BootStrap-Flask , Flask-Moment , Faker , Flask-Debug Toolbar 。 Git : 將大量代碼放到 app.py 一個文件里,代碼的管理會不太方便,可讀性也差。本節(jié)將使用一種新的代碼結(jié)構(gòu) 導(dǎo)入配置 :可以從pyt

    2024年02月09日
    瀏覽(43)
  • Flask狼書筆記 | 01_初識Flask,02_Flask與HTTP

    Flask狼書筆記 | 01_初識Flask,02_Flask與HTTP

    2023-8-11 以前對網(wǎng)站開發(fā)萌生了想法,又有些急于求成,在B站照著視頻敲了一個基于flask的博客系統(tǒng)。但對于程序的代碼難免有些囫圇吞棗,存在許多模糊或不太理解的地方,只會照葫蘆畫瓢。 而當(dāng)自己想開發(fā)一個什么網(wǎng)站的時,就如同摸著石頭過河,常在許多小問題上卡住

    2024年02月11日
    瀏覽(21)
  • Flask Web開發(fā)實戰(zhàn)(狼書)| 筆記第1、2章

    Flask Web開發(fā)實戰(zhàn)(狼書)| 筆記第1、2章

    2023-8-11 以前對網(wǎng)站開發(fā)萌生了想法,又有些急于求成,在B站照著視頻敲了一個基于flask的博客系統(tǒng)。但對于程序的代碼難免有些囫圇吞棗,存在許多模糊或不太理解的地方,只會照葫蘆畫瓢。 而當(dāng)自己想開發(fā)一個什么網(wǎng)站的時,就如同摸著石頭過河,常在許多小問題上卡住

    2024年02月12日
    瀏覽(22)
  • 【Flask 連接數(shù)據(jù)庫,使用Flask-Migrate實現(xiàn)數(shù)據(jù)庫遷移及問題匯總】

    Flask 連接數(shù)據(jù)庫,使用Flask-Migrate實現(xiàn)數(shù)據(jù)庫遷移 安裝Flask-Migrate插件 使用Flask-Migrate步驟 app.py主要用于數(shù)據(jù)庫連接 model.py 中導(dǎo)入了 db,作用是存儲一個User類 ,用于生成表頭。 manager.py用于數(shù)據(jù)遷移管理,運行后將生成一個文件夾。 Flask-Migrate運行 問題匯總 問題一:flask_mig

    2024年01月16日
    瀏覽(57)
  • Flask數(shù)據(jù)庫之SQLAlchemy--介紹--鏈接數(shù)據(jù)庫

    Flask數(shù)據(jù)庫之SQLAlchemy--介紹--鏈接數(shù)據(jù)庫

    目錄 SQLAlchemy介紹 SQLAlchemy連接數(shù)據(jù)庫? 數(shù)據(jù)庫是一個網(wǎng)站的基礎(chǔ)!??! 比如MySQL、MongoDB、SQLite、PostgreSQL等,這里我們以MySQL為例進(jìn)行講解。 SQLAlchemy是一個ORM框架 對象關(guān)系映射 (英語: Object Relational Mapping ,簡稱 ORM ,或 O/RM ,或 O/R mapping ),是一種程序設(shè)計技術(shù),用于實

    2024年02月07日
    瀏覽(27)
  • Flask連接數(shù)據(jù)庫

    目錄 ? 導(dǎo)入相應(yīng)包 創(chuàng)建接口 基于上述db對象創(chuàng)建一個Student 添加信息 顯示學(xué)生信息 修改與刪除信息 ? html頁面 將表單的 action 直接指向當(dāng)前路徑,這就要求在當(dāng)前路徑所對應(yīng)的函數(shù)中,對 POST 數(shù)據(jù)進(jìn)行處理: html頁面 添加路由 html頁面如下 修改代碼如下 刪除代碼如下 ? ?

    2024年02月15日
    瀏覽(43)
  • flask數(shù)據(jù)庫操作

    flask數(shù)據(jù)庫操作

    本文將詳細(xì)介紹在Flask Web應(yīng)用中如何設(shè)計數(shù)據(jù)庫模型,并使用Flask-SQLAlchemy等擴(kuò)展進(jìn)行數(shù)據(jù)庫操作的最佳實踐。內(nèi)容涵蓋數(shù)據(jù)模型設(shè)計,ORM使用,關(guān)系映射,查詢方法,事務(wù)處理等方面。通過本文,您可以掌握Flask數(shù)據(jù)庫應(yīng)用的基本知識。 Flask作為一個流行的Python Web框架,提供了高度的

    2024年02月14日
    瀏覽(23)
  • Flask數(shù)據(jù)庫操作-Flask-SQLAlchemy

    Flask數(shù)據(jù)庫操作-Flask-SQLAlchemy

    Flask中一般使用flask-sqlalchemy來操作數(shù)據(jù)庫。flask-sqlalchemy的使用介紹如下: 一、SQLAlchemy SQLALchemy 實際上是對數(shù)據(jù)庫的抽象,讓開發(fā)者不用直接和 SQL 語句打交道,而是通過 Python 對象來操作數(shù)據(jù)庫,在舍棄一些性能開銷的同時,換來的是開發(fā)效率的較大提升。 SQLAlchemy是一個關(guān)

    2024年02月22日
    瀏覽(27)
  • Flask-數(shù)據(jù)庫-SQLAlchemy

    Flask-數(shù)據(jù)庫-SQLAlchemy

    SQLAlchemy是flask的擴(kuò)展,是一個功能強大的OR映射器,支持多種數(shù)據(jù)庫后臺,可以將類的對象映射至數(shù)據(jù)庫表。 使用這個工具,可以創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表,并為數(shù)據(jù)庫添加數(shù)據(jù),進(jìn)行查詢操作等。 參考:Flask SQLAlchemy - Flask 教程 | BootWiki.com ?app=Flask(__name__)? #創(chuàng)建Flask實例 ?app

    2023年04月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包