【Python使用】嘿馬頭條項(xiàng)目從到完整開(kāi)發(fā)教程第2篇:數(shù)據(jù)庫(kù),理解ORM【附代碼文檔】

教程總體簡(jiǎn)介:2. 目標(biāo) ToutiaoWeb虛擬機(jī)使用說(shuō)明 Pycharm遠(yuǎn)程開(kāi)發(fā) 產(chǎn)品與開(kāi)發(fā) 1 產(chǎn)品介紹 2 原型圖與UI圖 3 技術(shù)架構(gòu) 4 開(kāi)發(fā) 數(shù)據(jù)庫(kù) APScheduler定時(shí)任務(wù) 定時(shí)修正統(tǒng)計(jì)數(shù)據(jù) RPC簡(jiǎn)介 1. 什么是RPC 2. 背景與用途 3. 概念說(shuō)明 4. 優(yōu)缺點(diǎn) gRPC 簡(jiǎn)介 架構(gòu) 使用方法 Protocol Buffers 1 文檔結(jié)構(gòu) 2 注釋 3 數(shù)據(jù)類型 3.2 枚舉 4 消息類型 4.1 字段編號(hào) 4.2 指定字段規(guī)則 4.3 添加更多消息類型 4.4 保留字段 4.5 默認(rèn)值 4.6 嵌套類型 5 map映射 6 oneof 7 定義服務(wù) 推薦系統(tǒng)接口定義 接口原型 使用Protobuf 定義的接口如下 代碼生成 補(bǔ)全服務(wù)端 編寫(xiě)客戶端 頭條首頁(yè)新聞推薦接口編寫(xiě) 即時(shí)通訊簡(jiǎn)介 需求場(chǎng)景 傳統(tǒng)的推送實(shí)現(xiàn) WebSocket Socket.IO 1 簡(jiǎn)介 2 Python服務(wù)器端開(kāi)發(fā) 安裝 創(chuàng)建服務(wù)器 事件處理 頭條聊天服務(wù)實(shí)現(xiàn) 頭條在線消息推送實(shí)現(xiàn) 需求 實(shí)現(xiàn) Elasticsearch 簡(jiǎn)介與原理 2 搜索的原理——倒排索引(反向索引)、分析、相關(guān)性排序 概念與集群 概念 IK中文分析器 索引與類型 索引 類型和映射 文檔 索引文檔(保存文檔數(shù)據(jù)) 獲取指定文檔 判斷文檔是否存在 更新文檔 刪除文檔 Logstash導(dǎo)入數(shù)據(jù) 查詢 1 基本查詢 2 高級(jí)查詢 頭條全文檢索實(shí)現(xiàn) elasticsearch python客戶端使用 頭條項(xiàng)目搜索接口視圖實(shí)現(xiàn) 添加ES新文章索引數(shù)據(jù) 聯(lián)想提示 1 拼寫(xiě)糾錯(cuò) 2 自動(dòng)補(bǔ)全 頭條suggest查詢實(shí)現(xiàn) 思路 單元測(cè)試 為什么要測(cè)試 測(cè)試的分類 單元測(cè)試的基本寫(xiě)法 Gunicorn Supervisor 配置 啟動(dòng) 部署相關(guān) 理解ORM 作用 思考: 使用ORM的方式選擇 SQLAlchemy映射構(gòu)建 2 安裝 3 數(shù)據(jù)庫(kù)連接設(shè)置 4 模型類字段與選項(xiàng) 5 構(gòu)建模型類映射 分布式ID 1 方案選擇 2 黑馬頭條 Redis 2 Redis持久化 5 用途 6 相關(guān)補(bǔ)充閱讀 Git工用流 Gitflow工作流 1 工作方式 2 歷史分支 3 功能分支 4 發(fā)布分支 5 維護(hù)分支 6 示例 頭條項(xiàng)目目錄 調(diào)試方法 JWT & JWS & JWE Json Web Token(JWT) JSON Web Signature(JWS) JWT的Python庫(kù) 用例 頭條項(xiàng)目實(shí)施方案 JWT禁用問(wèn)題 JWT認(rèn)證方案 OSS對(duì)象存儲(chǔ) CDN 緩存 緩存架構(gòu) 緩存數(shù)據(jù) 緩存數(shù)據(jù)的保存方式 緩存有效期與淘汰策略 有效期 TTL (Time to live) 緩存淘汰 eviction Redis淘汰策略的配置 緩存模式 1) Cache Aside 緩存問(wèn)題 1 緩存穿透 2 緩存雪崩 頭條項(xiàng)目緩存與存儲(chǔ)設(shè)計(jì) 緩存設(shè)計(jì) 1 User Cache 3 Article Cache 4 Announcement Cache 持久存儲(chǔ)設(shè)計(jì) 1 閱讀歷史 2 搜索歷史 3 統(tǒng)計(jì)數(shù)據(jù)

完整筆記資料代碼:https://gitee.com/yinuo112/Backend/tree/master/Python/嘿馬頭條項(xiàng)目從到完整開(kāi)發(fā)教程/note.md

感興趣的小伙伴可以自取哦~


全套教程部分目錄:


部分文件圖片:

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

  • 數(shù)據(jù)庫(kù)設(shè)計(jì)

  • SQLAlchemy

  • 數(shù)據(jù)庫(kù)理論

  • 分布式ID

  • Redis

理解ORM

作用

  • 省去自己拼寫(xiě)SQL,保證SQL語(yǔ)法的正確性

  • 一次編寫(xiě)可以適配多個(gè)數(shù)據(jù)庫(kù)

  • 防止注入

  • 在數(shù)據(jù)庫(kù)表名或字段名發(fā)生變化時(shí),只需修改模型類的映射,無(wú)需修改數(shù)據(jù)庫(kù)操作的代碼

(相比SQL的話,可能需要同步修改涉及到的每一個(gè)SQL語(yǔ)句)

思考:

可否在已經(jīng)存在數(shù)據(jù)庫(kù)表的情況下,使用模型類進(jìn)行操作?

使用ORM的方式選擇

  1. 先創(chuàng)建模型類,再遷移到數(shù)據(jù)庫(kù)中

    • 優(yōu)點(diǎn):簡(jiǎn)單快捷,定義一次模型類即可,不用寫(xiě)sql
    • 缺點(diǎn):不能盡善盡美的控制創(chuàng)建表的所有細(xì)節(jié)問(wèn)題,表結(jié)構(gòu)發(fā)生變化的時(shí)候,也會(huì)難免發(fā)生遷移錯(cuò)誤
  2. 先用原生SQL創(chuàng)建數(shù)據(jù)庫(kù)表,再編寫(xiě)模型類作映射

    • 優(yōu)點(diǎn):可以很好的控制數(shù)據(jù)庫(kù)表結(jié)構(gòu)的任何細(xì)節(jié),避免發(fā)生遷移錯(cuò)誤
    • 缺點(diǎn):可能編寫(xiě)工作多(編寫(xiě)sql與模型類,似乎有些牽強(qiáng))

頭條項(xiàng)目采用編寫(xiě)原生SQL創(chuàng)建表,之后再編寫(xiě)模型類進(jìn)行映射的方式。

SQLAlchemy映射構(gòu)建

1 簡(jiǎn)介

SQLAlchemy是Python編程語(yǔ)言下的一款開(kāi)源軟件。提供了SQL工具包及對(duì)象關(guān)系映射(ORM)工具,使用MIT許可證發(fā)行。

SQLAlchemy“采用簡(jiǎn)單的Python語(yǔ)言,為高效和高性能的數(shù)據(jù)庫(kù)訪問(wèn)設(shè)計(jì),實(shí)現(xiàn)了完整的企業(yè)級(jí)持久模型”。

SQLAlchemy首次發(fā)行于2006年2月,并迅速地在Python社區(qū)中最廣泛使用的ORM工具之一,不亞于Django的ORM框架。

Flask-SQLAlchemy是在Flask框架的一個(gè)擴(kuò)展,其對(duì)SQLAlchemy進(jìn)行了封裝,目的于簡(jiǎn)化在 Flask 中 SQLAlchemy 的 使用,提供了有用的默認(rèn)值和額外的助手來(lái)更簡(jiǎn)單地完成日常任務(wù)。

2 安裝

安裝Flask-SQLAlchemy

pip install flask-sqlalchemy

如果使用的是MySQL數(shù)據(jù)庫(kù),還需要安裝MySQL的Python客戶端庫(kù)

pip install mysqlclient

3 數(shù)據(jù)庫(kù)連接設(shè)置

在Flask中使用Flask-SQLAlchemy需要進(jìn)行配置,主要配置以下幾項(xiàng):

  • SQLALCHEMY_DATABASE_URI 數(shù)據(jù)庫(kù)的連接信息

    • Postgres:

postgresql://user:password@localhost/mydatabase




* MySQL:

```python
mysql://user:password@localhost/mydatabase
  • Oracle:
oracle://user:password@127.0.0.1:1521/sidname
  • SQLite (注意開(kāi)頭的四個(gè)斜線):
sqlite:////absolute/path/to/foo.db
  • SQLALCHEMY_TRACK_MODIFICATIONS 在Flask中是否追蹤數(shù)據(jù)修改

  • SQLALCHEMY_ECHO 顯示生成的SQL語(yǔ)句,可用于調(diào)試

這些配置參數(shù)需要放在Flask的應(yīng)用配置(app.config)中。

from flask import Flask

app = Flask(__name__)

class Config(object):
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/toutiao'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True

app.config.from_object(Config)

其他配置參考如下:

名字 備注
SQLALCHEMY_DATABASE_URI 用于連接的數(shù)據(jù)庫(kù) URI 。例如:sqlite:////tmp/test.dbmysql://username:password@server/db
SQLALCHEMY_BINDS 一個(gè)映射 binds 到連接 URI 的字典。更多 binds 的信息見(jiàn)[用 Binds 操作多個(gè)數(shù)據(jù)庫(kù)](
SQLALCHEMY_ECHO 如果設(shè)置為Ture, SQLAlchemy 會(huì)記錄所有 發(fā)給 stderr 的語(yǔ)句,這對(duì)調(diào)試有用。(打印sql語(yǔ)句)
SQLALCHEMY_RECORD_QUERIES 可以用于顯式地禁用或啟用查詢記錄。查詢記錄 在調(diào)試或測(cè)試模式自動(dòng)啟用。更多信息見(jiàn)get_debug_queries()。
SQLALCHEMY_NATIVE_UNICODE 可以用于顯式禁用原生 unicode 支持。當(dāng)使用 不合適的指定無(wú)編碼的數(shù)據(jù)庫(kù)默認(rèn)值時(shí),這對(duì)于 一些數(shù)據(jù)庫(kù)適配器是必須的(比如 Ubuntu 上 某些版本的 PostgreSQL )。
SQLALCHEMY_POOL_SIZE 數(shù)據(jù)庫(kù)連接池的大小。默認(rèn)是引擎默認(rèn)值(通常 是 5 )
SQLALCHEMY_POOL_TIMEOUT 設(shè)定連接池的連接超時(shí)時(shí)間。默認(rèn)是 10 。
SQLALCHEMY_POOL_RECYCLE 多少秒后自動(dòng)回收連接。這對(duì) MySQL 是必要的, 它默認(rèn)移除閑置多于 8 小時(shí)的連接。注意如果 使用了 MySQL , Flask-SQLALchemy 自動(dòng)設(shè)定 這個(gè)值為 2 小時(shí)。

4 模型類字段與選項(xiàng)

字段類型

類型名 python中類型 說(shuō)明
Integer int 普通整數(shù),一般是32位
SmallInteger int 取值范圍小的整數(shù),一般是16位
BigInteger int或long 不限制精度的整數(shù)
Float float 浮點(diǎn)數(shù)
Numeric decimal.Decimal 普通整數(shù),一般是32位
String str 變長(zhǎng)字符串
Text str 變長(zhǎng)字符串,對(duì)較長(zhǎng)或不限長(zhǎng)度的字符串做了優(yōu)化
Unicode unicode 變長(zhǎng)Unicode字符串
UnicodeText unicode 變長(zhǎng)Unicode字符串,對(duì)較長(zhǎng)或不限長(zhǎng)度的字符串做了優(yōu)化
Boolean bool 布爾值
Date datetime.date 時(shí)間
Time datetime.datetime 日期和時(shí)間
LargeBinary str 二進(jìn)制文件

列選項(xiàng)

選項(xiàng)名 說(shuō)明
primary_key 如果為True,代表表的主鍵
unique 如果為True,代表這列不允許出現(xiàn)重復(fù)的值
index 如果為True,為這列創(chuàng)建索引,提高查詢效率
nullable 如果為True,允許有空值,如果為False,不允許有空值
default 為這列定義默認(rèn)值

關(guān)系選項(xiàng)

選項(xiàng)名 說(shuō)明
backref 在關(guān)系的另一模型中添加反向引用
primary join 明確指定兩個(gè)模型之間使用的聯(lián)結(jié)條件
uselist 如果為False,不使用列表,而使用標(biāo)量值
order_by 指定關(guān)系中記錄的排序方式
secondary 指定多對(duì)多關(guān)系中關(guān)系表的名字
secondary join 在SQLAlchemy中無(wú)法自行決定時(shí),指定多對(duì)多關(guān)系中的二級(jí)聯(lián)結(jié)條件

5 構(gòu)建模型類映射

例用虛擬機(jī)中已有的頭條數(shù)據(jù)庫(kù),構(gòu)建模型類映射,以下面三張表為例

CREATE TABLE `user_basic` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶ID',
  `account` varchar(20) COMMENT '賬號(hào)',
  `email` varchar(20) COMMENT '郵箱',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態(tài),是否可用,0-不可用,1-可用',
  `mobile` char(11) NOT NULL COMMENT '號(hào)',
  `password` varchar(93) NULL COMMENT '密碼',
  `user_name` varchar(32) NOT NULL COMMENT '昵稱',
  `profile_photo` varchar(128) NULL COMMENT '頭像',
  `last_login` datetime NULL COMMENT '最后登錄時(shí)間',
  `is_media` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是自媒體,0-不是,1-是',
  `is_verified` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否實(shí)名認(rèn)證,0-不是,1-是',
  `introduction` varchar(50) NULL COMMENT '簡(jiǎn)介',
  `certificate` varchar(30) NULL COMMENT '認(rèn)證',
  `article_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '發(fā)文章數(shù)',
  `following_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '關(guān)注的人數(shù)',
  `fans_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '被關(guān)注的人數(shù)',
  `like_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '累計(jì)點(diǎn)贊人數(shù)',
  `read_count` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '累計(jì)閱讀人數(shù)',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `mobile` (`mobile`),
  UNIQUE KEY `user_name` (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶基本信息表';

CREATE TABLE `user_profile` (
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用戶ID',
  `gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '性別,0-男,1-女',
  `birthday` date NULL COMMENT '生日',
  `real_name` varchar(32) NULL COMMENT '真實(shí)姓名',
  `id_number` varchar(20) NULL COMMENT '身份證號(hào)',
  `id_card_front` varchar(128) NULL COMMENT '身份證正面',
  `id_card_back` varchar(128) NULL COMMENT '身份證背面',
  `id_card_handheld` varchar(128) NULL COMMENT '手持身份證',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
  `register_media_time` datetime NULL COMMENT '注冊(cè)自媒體時(shí)間',
  `area` varchar(20) COMMENT '地區(qū)',
  `company` varchar(20) COMMENT '公司',
  `career` varchar(20) COMMENT '職業(yè)',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶資料表';

CREATE TABLE `user_relation` (
  `relation_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `user_id` bigint(20) unsigned NOT NULL COMMENT '用戶ID',
  `target_user_id` bigint(20) unsigned NOT NULL COMMENT '目標(biāo)用戶ID',
  `relation` tinyint(1) NOT NULL DEFAULT '0' COMMENT '關(guān)系,0-取消,1-關(guān)注,2-拉黑',
  `create_t
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容