flask數(shù)據(jù)庫(kù)操作-flask_sqlalchemy(1)

本篇書書主要對(duì)以下幾個(gè)方面提出簡(jiǎn)要看法

  • flask_sqlalchemy模塊的安裝和簡(jiǎn)單使用
  • flask_sqlalchemy對(duì)數(shù)據(jù)庫(kù)的常規(guī)操作
  • 新知識(shí)拓展 - pypinyin模塊的安裝和簡(jiǎn)單使用

一.裕照、flask_sqlalchemy

1. 了解flask_sqlalchemy

flask_sqlalchemy是一個(gè)第三方插件兢卵,需要安裝吸祟。flask本身沒有操作數(shù)據(jù)庫(kù)的能力港华,需要借助flask_sqlalchemy對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作酱畅。

2. 安裝

1) 在pycharm的terminal中進(jìn)行安裝:pip install flask_sqlalchemy
2) 或者在命令行進(jìn)行安裝:pip install flask_sqlalchemy
注意:如果使用的是沙箱環(huán)境衣摩,需要激活沙箱環(huán)境:activate 環(huán)境名稱

3. 使用

在本篇書書中惩激,我們使用的是sqllite這種輕量級(jí)的關(guān)系型數(shù)據(jù)庫(kù)咙轩。sqllite數(shù)據(jù)庫(kù)是和python最契合的數(shù)據(jù)庫(kù)扼鞋,所以在安裝python的同時(shí)已經(jīng)攜帶了sqllite數(shù)據(jù)庫(kù)申鱼,所以我們不需要進(jìn)行安裝就可以使用。

1) 導(dǎo)入模塊

from flask_sqlalchemyimport SQLAlchemy

2) 配置和加載數(shù)據(jù)庫(kù)

# base_dir:當(dāng)前文件的路徑
# os.path.dirname:返回指定文件的目錄
# __file__:指當(dāng)前文件
# abspath:是絕對(duì)路徑
# print(base_dir): E:\Python\flaskPro_ORM
base_dir = os.path.dirname(
        os.path.abspath(__file__)
)

# 創(chuàng)建http實(shí)例
app = Flask(__name__)
# 數(shù)據(jù)庫(kù)存放的路徑
app.config["SQLALCHEMY_DATABASE_URI"] ="sqlite:///" + os.path.join(base_dir, "myDB.sqlite")
# 支持追蹤修改
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] =True
# flask服務(wù)器加載數(shù)據(jù)庫(kù)
db = SQLAlchemy(app)

3)定義數(shù)據(jù)表
使用pycharm來定義數(shù)據(jù)表云头,默認(rèn)類名就是表名捐友,但是要注意類名和表名還是有所區(qū)別:
類名首字母大寫,但表名則是完全的小寫字母溃槐,創(chuàng)建一個(gè)表觀察一下吧匣砖。

class Person(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), unique=True)
password = db.Column(db.String(32))
nickname = db.Column(db.String(32), default="")
age = db.Column(db.Integer, default=18)
gender = db.Column(db.String(16), default="男")
score = db.Column(db.Float, nullable=True)

4) 同步數(shù)據(jù)庫(kù)

db.create_all()

5) 整理
如果我們?cè)谝粋€(gè).py文件下即寫網(wǎng)頁(yè)視圖,又寫數(shù)據(jù)庫(kù)昏滴,同時(shí)又兼具運(yùn)行的任務(wù)猴鲫,那么這個(gè)文件的可讀性就會(huì)降低,所以通常情況下谣殊,我們會(huì)創(chuàng)建幾個(gè)不同的.py文件:
- views.py文件寫視圖相關(guān)代碼拂共,
- models.py文件負(fù)責(zé)數(shù)據(jù)庫(kù)代碼,
- app.py文件負(fù)責(zé)創(chuàng)建http實(shí)例和數(shù)據(jù)庫(kù)姻几,
- main.py文件負(fù)責(zé)運(yùn)行
讓他們各自負(fù)責(zé)各自的部分宜狐,各司其職势告,這樣可讀性會(huì)大大提高。

二抚恒、數(shù)據(jù)庫(kù)基本操作

1. 常規(guī)操作

數(shù)據(jù)庫(kù)的常規(guī)操作無外乎增(add)刪(delete)改查四個(gè)操作咱台,只是不同的編程語(yǔ)言、不同的數(shù)據(jù)庫(kù)軟件有不同的語(yǔ)法俭驮。flask_sqlalchemy的語(yǔ)法如下:

1) 增

# 增加一條數(shù)據(jù)
person = Person(
username ="maggie",
    password ="123456",
    nickname ="張三",
    gender ="女",
    score =99
)
db.session.add(person)
db.session.commit()

# 增加多條數(shù)據(jù)
person1 = Person(
username ="lisi",
    password ="123456",
    nickname ="李四",
    gender ="男",
    score =80
)
person2 = Person(
username ="wangwu",
    password ="123456",
    nickname ="王五",
    gender ="女",
    score =90
)
db.session.add_all([person1, person2])
db.session.commit()

注意:增加數(shù)據(jù)需要進(jìn)行提交回溺,增加單個(gè)數(shù)據(jù)和增加多個(gè)數(shù)據(jù)的add方法有細(xì)微差別。

2) 查

詳情請(qǐng)戳:淺談flask_sqlalchemy(2) - 讓人又愛又恨的數(shù)據(jù)查詢

3) 改

# 修改id為5的用戶的性別為男
person = Person.query.get(5)
person.gender = '男'
db.session.commit()

4) 刪

# 刪除id為50的用戶
person = Person.query.get(1)
db.session.delete(person)
db.session.commit()

5) 整理
常規(guī)的flask_sqlalchemy操作比較復(fù)雜表鳍,但是基于面向?qū)ο罂梢赃M(jìn)行修改馅而。

  • 所有表默認(rèn)都有主鍵id
  • 所有的數(shù)據(jù)都需要增刪改,即都需要提交commite
    所以我們可以將其整理為
class Base(db.Model):
    # 作為父類完成被繼承譬圣,本身不執(zhí)行
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    def save(self):
        db.session.add(self)
        db.session.commit()
    def delete(self):
        db.session.delete(self)
        db.session.commit()
    def update(self):
        db.session.commit()

class Person(Base):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    nickname = db.Column(db.String(32), default="")
    age = db.Column(db.Integer, default=18)
    gender = db.Column(db.String(16), default="男")
    score = db.Column(db.Float, nullable=True)

我們將增刪改都整理在Base父類中瓮恭,新建的表繼承父類Base,同時(shí)也繼承了父類中增加(save方法)厘熟、刪除(delete方法)屯蹦、修改(update方法),簡(jiǎn)化了代碼绳姨。
例如:

p = Person()
p.username = "hello"
p.password = "world"
p.save()

2. 關(guān)系操作

在數(shù)據(jù)庫(kù)建模的過程中登澜,不止有基于業(yè)務(wù)主體描述的數(shù)據(jù)庫(kù)模型,還有關(guān)系模型飘庄,常用的關(guān)系模型有以下兩種:

(1)一對(duì)多關(guān)系
  • 例如:?jiǎn)T工和職位的關(guān)系就是一對(duì)多關(guān)系脑蠕,一個(gè)員工只能有一個(gè)職位,一個(gè)職位可以有很多員工跪削。
  • 在數(shù)據(jù)庫(kù)中谴仙,我們通常采用外鍵的方式來進(jìn)行一對(duì)多約束
    外鍵用字段db.ForeignKey("對(duì)應(yīng)主鍵表的字段")
  • 同時(shí)需要一個(gè)快速的方法進(jìn)行兩表的查詢,所以在主鍵表中設(shè)置反向映射來方便查詢碾盐。
    反向映射:
字段 = db.relationship(
      "多表的類名", 
      backref = "多表查詢一表使用的字段"
)
  • 小總結(jié)
    一表是主鍵表
    多表是外鍵表
    在外鍵表里搭外鍵
    在主鍵表里搭反向映射
職位表.png
"""
具體代碼
"""
class Person(Base):
    """
    職員表
    """
    username = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(32))
    nickname = db.Column(db.String(32), default="")
    age = db.Column(db.Integer, default=18)
    # 聲明p_position是一個(gè)外鍵整形字段晃跺,對(duì)應(yīng)position表的id
    p_position = db.Column(db.Integer, db.ForeignKey("position.id"))

class Position(Base):
    """
    職位表
    """
    p_name = db.Column(db.String(32))
    p_level = db.Column(db.Integer)
    p_department = db.Column(db.Integer, db.ForeignKey("department.id"))
    # 映射到職員表
    p_person = db.relationship(
        "Person",
        backref="person_position"
    )

# 查詢財(cái)務(wù)部職員職位的員工
person = Position.query.get(7)
for p in person.p_person:
    print(p.nickname, person.p_name)

# 查詢id為1的職員的職位
person = Person.query.get(1)
print(person.nickname, person.person_position.p_name)
參考圖片1.png
參考圖片2.png
(2) 多對(duì)多關(guān)系
  • 例如:職位和對(duì)應(yīng)的權(quán)限,每個(gè)職位有對(duì)應(yīng)的多個(gè)權(quán)限毫玖,但每個(gè)職位的權(quán)限又不太一樣
  • 多對(duì)多關(guān)系的解決依賴于建立中間表
    關(guān)系圖解.png
# 中間表:中間表一定要這樣創(chuàng)建
pos_per = db.Table(
    "pos_per",  # 表名
    db.Column("pos_id", db.Integer, db.ForeignKey("position.id")),
    db.Column("per_id", db.Integer, db.ForeignKey("permission.id")),
)


class Position(Base):
    """
    職位表
    """
    p_name = db.Column(db.String(32))
    p_level = db.Column(db.Integer)
    p_department = db.Column(db.Integer, db.ForeignKey("department.id"))
    # 映射到職員表
    p_person = db.relationship(
        "Person",
        backref="person_position"
    )
    # 映射到權(quán)限表
    p_permission = db.relationship(
        "Permission",
        secondary=pos_per,          # 中間表
        backref="p_position"        # 反向映射字段
    )


class Permission(Base):
    """
    權(quán)限表
    """
    per_name = db.Column(db.String(256))

# 查詢權(quán)限對(duì)應(yīng)的職位
permission = Permission.query.get(2)
print(permission.per_name)    # 組織部門會(huì)議
for p in permission.p_position:
    print(p.p_name)    # 經(jīng)理  主任

# 查看職位對(duì)應(yīng)的權(quán)限
position = Position.query.get(12)
print(position.p_name)    # 主任
for per in position.p_permission:
    print(per.per_name)    # 查看部門考勤  組織部門會(huì)議

三掀虎、知識(shí)補(bǔ)充庫(kù)

1. pypinyin模塊

pypinyin是一個(gè)好用的第三方模塊,可以將漢字轉(zhuǎn)換成拼音付枫,在某些時(shí)候給我們提供方便

1)下載模塊
可以直接在pycharm下的terminal命令行進(jìn)行安裝
安裝命令:

pip install pypinyin

2)導(dǎo)入模塊

import pypinyin

3)使用

py_name = pypinyin.lazy_pinyin("張三")

如有不妥烹玉,歡迎指正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市阐滩,隨后出現(xiàn)的幾起案子春霍,更是在濱河造成了極大的恐慌,老刑警劉巖叶眉,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件址儒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衅疙,警方通過查閱死者的電腦和手機(jī)莲趣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饱溢,“玉大人喧伞,你說我怎么就攤上這事〖ɡ桑” “怎么了潘鲫?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肋杖。 經(jīng)常有香客問我溉仑,道長(zhǎng),這世上最難降的妖魔是什么状植? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任浊竟,我火速辦了婚禮,結(jié)果婚禮上津畸,老公的妹妹穿的比我還像新娘振定。我一直安慰自己,他們只是感情好肉拓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布后频。 她就那樣靜靜地躺著,像睡著了一般暖途。 火紅的嫁衣襯著肌膚如雪卑惜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天丧肴,我揣著相機(jī)與錄音残揉,去河邊找鬼。 笑死芋浮,一個(gè)胖子當(dāng)著我的面吹牛抱环,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纸巷,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镇草,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瘤旨?” 一聲冷哼從身側(cè)響起梯啤,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎存哲,沒想到半個(gè)月后因宇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體七婴,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年察滑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了打厘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贺辰,死狀恐怖户盯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饲化,我是刑警寧澤莽鸭,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站吃靠,受9級(jí)特大地震影響硫眨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撩笆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一捺球、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夕冲,春花似錦氮兵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至弥姻,卻和暖如春南片,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背庭敦。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工疼进, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人秧廉。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓伞广,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親疼电。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嚼锄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容