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