摘要:后端一個重要的點就是與數(shù)據(jù)庫聯(lián)系,例如網(wǎng)頁的注冊登錄,內(nèi)容的更新等都需要與數(shù)據(jù)庫建立關(guān)系。就是一個這樣的,我們可以直接安裝來使用。最后用來實現(xiàn)創(chuàng)建。
后端一個重要的點就是與數(shù)據(jù)庫聯(lián)系,例如網(wǎng)頁的注冊、登錄,內(nèi)容的更新等都需要與數(shù)據(jù)庫建立關(guān)系。以MySQL數(shù)據(jù)庫為例,平時我們會用mysqldb(python 2)或者pymysql(python 3)去操作MySQL數(shù)據(jù)庫,但這種方法也是需要自己編寫SQL語句的?,F(xiàn)在我們有了ORM模型,簡單來說,ORM是把數(shù)據(jù)庫中的表抽象成模型,表的列名對應(yīng)模型的屬性,這樣我們可以調(diào)用類的屬性或方法去獲得數(shù)據(jù)庫中的數(shù)據(jù)。例如假設(shè)MySQL數(shù)據(jù)庫中有一張表名為table1,使用SELECT * FROM table1 WHERE id=1獲取id為1的數(shù)據(jù),如果將表table1映射成ORM模型Table,那么可以直接使用Table.query.filter(id=1),這樣操作簡單了很多,也很利于理解。
SQLAlchemy就是一個這樣的ORM,我們可以直接安裝flask_sqlalchemy來使用。在這之前我們先在MySQL中手動建立一個數(shù)據(jù)庫harp,在建立的時候把charset設(shè)置為utf8,避免存入中文時變成亂碼,然后在配置文件config.py中填寫好數(shù)據(jù)庫的連接信息:
HOST = "127.0.0.1" PORT = "3306" DB = "harp" USER = "root" PASS = "Your Password" CHARSET = "utf8" DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset={}".format(USER, PASS, HOST, PORT, DB, CHARSET) SQLALCHEMY_DATABASE_URI = DB_URI
SQLAlchemy依賴mysqldb或者pymysql去連接數(shù)據(jù)庫和執(zhí)行SQL語句,因為我們用的是python 3,所以需要在配置信息中指明使用pymysql,如果是python 2可以省略,默認(rèn)是使用mysqldb。
建立好了數(shù)據(jù)庫,我們開始建表,首先建立一張用戶表,我們設(shè)想它應(yīng)該有id(作為主鍵)、用戶名、密碼、注冊時間這些基本的字段,有了ORM,我們就不用再寫SQL去建表了,在項目的主py文件中添加以下代碼:
from flask_sqlalchemy import SQLAlchemy from datetime import datetime import config app = Flask(__name__) app.config.from_object(config) db = SQLAlchemy(app) class Users(db.Model): __tablename__ = "users_info" id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(32), nullable=False) password = db.Column(db.String(100), nullable=False) register_time = db.Column(db.DateTime, nullable=False, default=datetime.now()) db.create_all()
解讀一下這段代碼,導(dǎo)入SQLAlchemy和含有數(shù)據(jù)庫連接信息的config,實例化一個SQLAlchemy對象名為db,其傳入的參數(shù)為Flask實例app。接下來定義了一個User類,這個類就是ORM中的模型,也就是數(shù)據(jù)庫中的表映射的模型,它需要繼承自db.Model,__tablename__這個屬性就是建表后,數(shù)據(jù)庫生成的表名;然后使用db.Column來實例化id/username/password/register_time這幾個列,db.Column的參數(shù)描述列的類型、主鍵等信息,如db.Integer/db.String(32)/db.DateTime分別代表整形、字符串(最大長度)、時間,primary_key=True說明該字段為主鍵,autoincrement=True代表自增長,nullable決定是否可為空,default代表默認(rèn)值。最后用db.create_all()來實現(xiàn)創(chuàng)建。我們暫時不用理解為何SQLAlchemy需要傳入Flask實例作為參數(shù),為何模型要繼承自db.Model,重要的是可以先把想要的表建立起來。
進入數(shù)據(jù)庫,輸入desc user_info;,我們發(fā)現(xiàn)表已經(jīng)建立好了,其結(jié)構(gòu)圖如下:
但它現(xiàn)在還是空的,我們來試著插入一條語句,將視圖函數(shù)修改為:
@app.route("/") def index(): user = Users(username="Harp", password="123456") db.session.add(user) db.session.commit() return render_template("home.html")
代碼實例化一個Users的對象user,傳入username和password,使用db.session.add(user)將其加入到數(shù)據(jù)庫的session(可以理解為事務(wù))中,然后使用db.session.commit()提交。我們運行程序,然后用瀏覽器訪問,瀏覽器正常顯示了結(jié)果,這時再看一眼數(shù)據(jù)庫,發(fā)現(xiàn)這條數(shù)據(jù)已經(jīng)寫入到了數(shù)據(jù)庫:
查詢、修改數(shù)據(jù)也同樣很簡單:
@app.route("/") def index(): user = Users.query.filter(Users.id == 1).first() #查找 print(user.username) user.username = "Harp1207" #修改 db.session.commit() #修改后需提交 print(user.username) return render_template("home.html")
思考問題:
1.為何要把模型的操作語句放在視圖函數(shù)中?(搜索上下文這個概念)
2.數(shù)據(jù)查找,我們用的是Model.query,其實還可以用db.session.query,兩者有何區(qū)別?filter和filter_by又有何區(qū)別?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41231.html
摘要:本節(jié)圍繞在中如何定義關(guān)系及如何使用關(guān)系進行查詢進行講解,使讀者能夠快速掌握的關(guān)系操作。班級與學(xué)生為一對多關(guān)系,班級與老師之間為多對多關(guān)系。三年二班多對多關(guān)系的使用通過關(guān)聯(lián)模型實現(xiàn),在其中分別設(shè)置模型和的外鍵,并且在父模型中設(shè)置相應(yīng)的實現(xiàn)。 上一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置下一篇文章:Python-SQLAlchemy:第4節(jié):級聯(lián) 關(guān)系數(shù)據(jù)庫是建立...
摘要:在實際項目中,這么做肯定是不行的實際項目中不會使用內(nèi)存數(shù)據(jù)庫,這種數(shù)據(jù)庫一般只是在單元測試中使用。接下來,我們將會了解中單元測試的相關(guān)知識。 在上一篇文章,我們介紹了SQLAlchemy的基本概念,也介紹了基本的使用流程。本文我們結(jié)合webdemo這個項目來介紹如何在項目中使用SQLAlchemy。另外,我們還會介紹數(shù)據(jù)庫版本管理的概念和實踐,這也是OpenStack每個項目都需要做的...
摘要:承接上文,我們的,除了用戶表,還需要存儲所有問題內(nèi)容的表和存儲所有評論的表,并且都和通過外鍵來關(guān)聯(lián)。我們不排除后續(xù)需要更多表的可能性,把所有模型和視圖函數(shù)寫在一起看著也太混亂了為此,我們新建一個,把三個模型都放在這里。 承接上文,我們的Q&A demo,除了用戶表,還需要存儲所有問題內(nèi)容的表questions_info和存儲所有評論的表comments_info,并且都和users_i...
摘要:下一篇文章第節(jié)查詢條件設(shè)置是編程語言下的一款開源軟件。提供了工具包及對象關(guān)系映射工具,使用許可證發(fā)行。在關(guān)閉連接時會自動進行事務(wù)提交操作。引入多條件查詢時使用。由于上下文函數(shù)退出時會自動提交事務(wù),所以無需顯示的調(diào)用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關(guān)系...
摘要:當(dāng)使用到后者這類微型框架時,根據(jù)業(yè)務(wù)場景不同,如果需要處理模型的建立升級和遷移的問題,可以考慮下接下來要介紹的和。這時候檢查數(shù)據(jù)庫,可以發(fā)現(xiàn)生成了張表,升級工作就完成了。而我在使用的實際項目中是操作的原生,異步類型的配合使用留待以后探究。 背景 Python的世界里有許多web框架:比如大而全的 Django, 提供了模型定義遷移,到路由處理,再到視圖的渲染等整套功能;比如小巧靈活的F...
閱讀 1447·2023-04-25 16:31
閱讀 2052·2021-11-24 10:33
閱讀 2753·2021-09-23 11:33
閱讀 2541·2021-09-23 11:31
閱讀 2919·2021-09-08 09:45
閱讀 2348·2021-09-06 15:02
閱讀 2656·2019-08-30 14:21
閱讀 2323·2019-08-30 12:56