flask的orm框架(SQLAlchemy)-操作數據


# 原創,轉載請留言聯系

  • Flask-SQLAlchemy 實現增加數據

用 sqlalchemy 添加數據時,一定要注意,不僅僅要連接到數據表,並且你的創建表的類也必須寫進來。而且字段和約束條件要吻合,不然會報錯的。

sqlalchemy插入數據的格式一般是這樣:

變量=創建表的類(字段名1=要插入的數據1,字段名2=要插入的數據2,...)    # 例如下面的18行

orm 框架的操作對象.session.add(變量)    # 例如下面的19行。add 也有另一種用法,見25行

orm 框架的操作對象.session.commit( )    # 例如下面的20行

注意:flask 默認開啟事務,所以操作完成后要 commit 才能提交到數據庫。

 1 from flask import Flask
 2 from flask_sqlalchemy import SQLAlchemy
 3 
 4 app=Flask(__name__)
 5 
 6 app.config['SQLALCHEMY_DATABASE_URI'] = '數據庫類型://數據庫登錄名:數據庫登錄密碼@數據庫的地址:數據庫的端口/數據庫的名字'
 7 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
 8 app.config['SQLALCHEMY_ECHO'] = True
 9 db = SQLAlchemy(app)
10 
11 class Role(db.Model):
12     __tablename__ = "my_table"    # 寫表名
13     id = db.Column(db.INTEGER,primary_key=True)    # 這行不能刪
14     name = db.Column(db.String(10),nullable=False)    # 這行也是
15 
16 @app.route("/")
17 def index():
18     r1 = Role(name="用戶1")
19     db.session.add(r1)
20     db.session.commit()    # flask默認使用事務,所以每一次操作都要提交事務
21 
22     r2 = Role(name="用戶2")
23     r3 = Role(name="用戶3")
24     r4 = Role(name="用戶4")
25     db.session.add_all([r2,r3,r4])    #多行時可以用session.add_all([x,x,x])
26     db.session.commit()
27     return "hello"
28 
29 if __name__ == '__main__':
30     app.run(debug=True)

注意:上面的代碼,每刷新一次主頁,就會增加4條數據進 my_table 表。(因為插入的語句寫在視圖函數里面。)

 

  • Flask-SQLAlchemy 實現查詢數據

查詢數據的用法比較復雜,所以最好舉例子說明。

1.查詢全部的用戶

user = User.query.all()

:User 是創建表的類,這里替代表來使用。

all( ) 就是查詢所有的,也可以查詢第一個的,用 first( ) 。

返回的結果 user 其實是一個列表,里面的每一個元素都是一行數據。有點抽象,你可以想象成一個表插分成一行一行的,然后放在列表里。

2.查詢 id 是 1 的用戶的名字

user = User.query.filter(User.id == 1).first()

user.name

:filter 是一個過濾器,里面寫條件,相當與SQL語句的 where 。但是注意字段名前要寫創建表的類。

還需要注意的是有兩個等於號 ==

如果 id 是主鍵的話,還可以這樣:

user = User.query.get(1)

3.其他:

    #查詢有多少個用戶
    count = User.query.count()
    print(count)

    # 查詢第一個用戶
    first_user = User.query.first()
    print(first_user)

    # 查詢id為4的用戶信息(方式1,最常用)
    fourth_user = User.query.filter(User.id==4).all()
    print(fourth_user)

    # 查詢id為4的用戶信息(方式2)
    fourth_user = User.query.get(4)
    print(fourth_user)

    # 查詢id為4的用戶信息(方式3)
    fourth_user = User.query.filter_by(id=4).all()
    print(fourth_user)

    # 查詢名字結尾字符為g的所有數據
    endwithg = User.query.filter(User.name.endswith("g")).all()
    print(endwithg)

    # 查詢名字開頭字符為g的所有數據
    startwithg = User.query.filter(User.name.startswith("z")).all()
    print(startwithg)

    # 查詢名字不等於wang的所有數據[2種方式]
    notwang = User.query.filter(User.name != "wang").all()    # 最常用
    print(notwang)

    notwang = User.query.filter(not_(User.name == "wang")).all()
    print(notwang)

    # 查詢名字和郵箱都以 li 開頭的所有數據[2種方式]
    userdd = User.query.filter(User.name.startswith("li"),User.email.startswith("li")).all()    #常見
    print(userdd)

    userdd = User.query.filter(and_(User.name.startswith("li"),User.email.startswith("li"))).all()
    print(userdd)

    # 查詢password是`123456`或者`email`以`itheima.com`結尾的所有數據
    user = User.query.filter(or_(User.password == "123456",User.email.endswith("itheima.com"))).all()
    print(user)

    # 查詢id為[1, 3, 5, 7, 9]的用戶列表
    # SQL語句中范圍查詢 in
    # flask中 模型類名.字段.in_(列表)
    list1 = [1,3,5,7,9]
    user = User.query.filter(User.id.in_(list1)).all()
    print(user)



    # 查詢所有用戶數據,並以郵箱排序
    user = User.query.order_by(User.id).all()    #順序
    print(user)

    user = User.query.order_by(User.id.desc()).all()  # 倒序,字段名后加desc()
    print(user)

    # 每頁3個,查詢第2頁的數據
    # ret = paginate(頁碼,每一頁的數據量)
    ret = User.query.paginate(2,3)
    print(ret.page)
    print(ret.items)

注意:用到not_,or_,and_ 要導入!!!

from sqlalchemy import not_,or_,and_

 

 

  • Flask-SQLAlchemy 實現修改和刪除數據

sqlchemy 修改和刪除數據都是基於查詢上的。我們必須先查出數據,all()是查出一行一行數據的列表,first()是查出第一行數據。一定要有這種查出來是一行的思想,才能更好的學習ORM。

1.修改數據

user = User.query.first()
user.name = 'dong'
db.session.commit()

2.刪除數據

user = User.query.first()
db.session.delete(user)
db.session.commit()

還有另一種方式:

User.query.first().delete()
db.session.commit()

 

# 查詢名字結尾字符為g的所有數據[開始/包含]
endwithg = User.query.filter(User.name.endswith("g")).all()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM