Flask 系列之 SQLAlchemy

来源:https://www.cnblogs.com/hippieZhou/archive/2019/03/26/10273383.html
-Advertisement-
Play Games

SQLAlchemy 是一種 ORM 框架,通過使用它,可以大大簡化我們對資料庫的操作,不用再寫各種複雜的 了。 說明 操作系統:Windows 10 Python 版本:3.7x 虛擬環境管理器:virtualenv 代碼編輯器:VS Code 實驗目標 實現網站與 mysql 資料庫的連接和 C ...


SQLAlchemy 是一種 ORM 框架,通過使用它,可以大大簡化我們對資料庫的操作,不用再寫各種複雜的 sql語句 了。

說明

  • 操作系統:Windows 10
  • Python 版本:3.7x
  • 虛擬環境管理器:virtualenv
  • 代碼編輯器:VS Code

實驗目標

實現網站與 mysql 資料庫的連接和 CRUD 操作。

MYSQL 的安裝與配置

打開 Ubuntu 16.04 的 bash 界面,執行下述操作

# 安裝
sudo apt update && sudo apt install mysql-server mysql-client
sudo service mysql status

# 配置安全性
sudo mysql_secure_installation
sudo mysqladmin -p -u root version

# 查看狀態
sudo service mysql status
sudo service mysql start
sudo service mysql stop

# 設置字元編碼
sudo vim /etc/mysql/conf.d/mysql.cnf

# 修改如下:
[mysql]
no-auto-rehash
default-character-set=utf8
[mysqld]
socket = /var/run/mysqld.sock
port =3306
character-set-server=utf8  # 必須設置,否則會導致無法插入中文數據

# 重啟服務
sudo service mysql restart

mysql 常用用法

# 進入 mysql
mysql -u root -p

# 查看當前字元編碼
show variables like 'character%';

# 創建資料庫 db_name
create database db_name charset=utf8;

# 顯示以存在的所有資料庫
show databases;

# 指定資料庫 db_name
use db_name;

# 創建資料庫表
create table table_name;

# 查看表信息
desc tablename;

# 刪除 資料庫 db_name
drop database db_name;

# 退出
exit;

使用 SQLAlchemy

首先進入 mysql 的控制台界面,創建我們需要使用的資料庫

sudo mysql -u root -p
create database todo;
use todo;

安裝 flask-sqlalchemy

pip install pymysql
pip install flask-sqlalchemy

todolist 目錄下創建 config.py 文件,示例代碼如下所示:

import os

basedir = os.path.abspath(os.path.dirname(__file__))


class Config(object):
    SQLALCHEMY_DATABASE_URI = os.environ.get(
        'SQLALCHEMY_DATABASE_URI') or 'mysql+pymysql://root:[email protected]:3306/todo'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

修改 todolist\app\__init__.py,示例代碼如下所示:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from config import Config

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)


@app.route('/')
@app.route('/index')
def index():
    title = 'Home'
    greet = 'Hello World'
    return render_template('index.html', title=title, greet=greet)

todolist 目錄下創建 models.py 文件,示例代碼如下所示:

from app import db
from datetime import datetime


class User(db.Model):
    __tablename__ = 'users'
    # __table_args__ = {"useexisting": True}

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), nullable=False, unique=True)
    email = db.Column(db.String(120), nullable=False, unique=True)
    pwd = db.Column(db.String(120), nullable=False)

    things = db.relationship('Thing', backref='User', lazy='dynamic')

    def __repr__(self):
        return "<User %r>" % self.name


class Thing(db.Model):
    __tablename__ = 'things'
    # __table_args__ = {"useexisting": True}

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
    title = db.Column(db.String(20), nullable=False)
    text = db.Column(db.Text, nullable=False)
    add_date = db.Column(db.DateTime, default=datetime.now)

    def __repr__(self):
        return "<Todo %r>" % self.id

修改 todolist\manage.py,示例代碼如下所示:

from app import app, db
from models import User, Thing
from werkzeug.security import generate_password_hash

if __name__ == "__main__":
    db.drop_all()
    db.create_all()

    pwd = generate_password_hash('123456789')
    u1 = User(name='admin', email='[email protected]', pwd=pwd)
    db.session.add(u1)
    db.session.commit()

    t1 = Thing(user_id=1, title='hello world', text='welcome to my hippiedom.')
    db.session.add(t1)
    db.session.commit()

    u2 = User.query.get(1)
    print(u2)

    app.run(debug=True, host='0.0.0.0', port=5000)

此時,執行 python manage.py,若程式無資料庫相關的錯誤信息,則表明資料庫中相應表已經創建成功,我們可以在 mysql 的 shell 視窗進行查看。

參考


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前幾天工作忙得焦頭爛額時,同事問了一下關於Map的特性,剎那間懵了一下,緊接著就想起來了一些關於Map的一些知識,因為只要涉及到Collection集合類時,就會談及Map類,因此理解好Map相關的知識是灰常重要的。 Collection集合類 與 Map類的層次結構,如下圖: Map是用來存儲 K ...
  • Mybatis-持久層的框架,功能是非常強大的,對於移動互聯網的高併發 和 高性能是非常有利的,相對於Hibernate全自動的ORM框架,Mybatis簡單,易於學習,sql編寫在xml文件中,和代碼分離,易於維護,屬於半ORM框架,對於面向用戶層面的互聯網業務性能和併發,可以通過sql優化解決一 ...
  • 題目: 給定一個單鏈表 L​1​​→L​2​​→⋯→L​n−1​​→L​n​​,請編寫程式將鏈表重新排列為 L​n​​→L​1​​→L​n−1​​→L​2​​→⋯。例如:給定L為1→2→3→4→5→6,則輸出應該為6→1→5→2→4→3。 輸入格式: 每個輸入包含1個測試用例。每個測試用例第1行給出 ...
  • java方法返回值與參數 例: public void a(int c){ //void 說明此方法沒有返回值,括弧里的叫參數,有數據類型和變數名組成,在方法里叫做形式參數簡稱形參。 } public int a(){ //這裡說明返回值是int整型,4位元組。 //返回關鍵字是return retu ...
  • 一、分散式鎖背景 a、什麼是鎖? 從使用場景定義:當存在多個線程可以同時改變某個變數時,就需要對變數或代碼塊做同步,使其在修改這種變數時能夠線性執行消除併發修改變數。 鎖的實現方式有多種,只要能滿足所有線程都能看得到這個鎖標記即可。 Java中常見的鎖: synchronized Reentrant ...
  • 實現目的:為了存儲了公共字典表主鍵的其他表在查詢的時候不用關聯查詢(所以攔截位置位於mybaits語句查詢得出結果集後) 項目環境 :springboot+mybaits 實現步驟:自定義註解——自定義實現mybaits攔截器——註冊mybaits攔截器 一、自定義註解 1.1 代碼示例 @Targ ...
  • 註意:如果使用notepad++編碼,在cmd控制台編譯時報錯(編碼GBK的不可映射字元),可以參考如下鏈接進行設置:https://jingyan.baidu.com/article/e3c78d649a56233c4c85f502.html 1.編寫案例演示每種不同數據類型的變數定義 /* 變數 ...
  • socket基礎 什麼是socket? - socket為介面通道,內部封裝了IP地址、埠、協議等信息;我們可以看作是以前的通過電話機撥號上網的年代,socket即為電話線 socket通信流程 我們通過下麵的圖來瞭解socket的通信流程 流程描述: - 1 伺服器根據地址類型(ipv4,ipv ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...