成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

5.ORM與SQLAlchemy (1) - 建立第一個模型

ghnor / 685人閱讀

摘要:后端一個重要的點就是與數(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獲取id1的數(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,傳入usernamepassword,使用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

相關(guān)文章

  • Python-SQLAlchemy3節(jié):關(guān)系操作

    摘要:本節(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ù)庫是建立...

    William_Sang 評論0 收藏0
  • 通過demo學(xué)習(xí)OpenStack開發(fā)所需的基礎(chǔ)知識 -- 數(shù)據(jù)庫(2)

    摘要:在實際項目中,這么做肯定是不行的實際項目中不會使用內(nèi)存數(shù)據(jù)庫,這種數(shù)據(jù)庫一般只是在單元測試中使用。接下來,我們將會了解中單元測試的相關(guān)知識。 在上一篇文章,我們介紹了SQLAlchemy的基本概念,也介紹了基本的使用流程。本文我們結(jié)合webdemo這個項目來介紹如何在項目中使用SQLAlchemy。另外,我們還會介紹數(shù)據(jù)庫版本管理的概念和實踐,這也是OpenStack每個項目都需要做的...

    mingzhong 評論0 收藏0
  • 6.ORMSQLAlchemy (2) - 模型關(guān)系引用

    摘要:承接上文,我們的,除了用戶表,還需要存儲所有問題內(nèi)容的表和存儲所有評論的表,并且都和通過外鍵來關(guān)聯(lián)。我們不排除后續(xù)需要更多表的可能性,把所有模型和視圖函數(shù)寫在一起看著也太混亂了為此,我們新建一個,把三個模型都放在這里。 承接上文,我們的Q&A demo,除了用戶表,還需要存儲所有問題內(nèi)容的表questions_info和存儲所有評論的表comments_info,并且都和users_i...

    libin19890520 評論0 收藏0
  • Python-SQLAlchemy1節(jié):SQLAlchemy入門

    摘要:下一篇文章第節(jié)查詢條件設(shè)置是編程語言下的一款開源軟件。提供了工具包及對象關(guān)系映射工具,使用許可證發(fā)行。在關(guān)閉連接時會自動進行事務(wù)提交操作。引入多條件查詢時使用。由于上下文函數(shù)退出時會自動提交事務(wù),所以無需顯示的調(diào)用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關(guān)系...

    noONE 評論0 收藏0
  • Python數(shù)據(jù)模型構(gòu)建和遷移方案:SQLAlchemy&Alembic

    摘要:當(dāng)使用到后者這類微型框架時,根據(jù)業(yè)務(wù)場景不同,如果需要處理模型的建立升級和遷移的問題,可以考慮下接下來要介紹的和。這時候檢查數(shù)據(jù)庫,可以發(fā)現(xiàn)生成了張表,升級工作就完成了。而我在使用的實際項目中是操作的原生,異步類型的配合使用留待以后探究。 背景 Python的世界里有許多web框架:比如大而全的 Django, 提供了模型定義遷移,到路由處理,再到視圖的渲染等整套功能;比如小巧靈活的F...

    李增田 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<