首頁 > 軟體

Python flask sqlalchemy的簡單使用及常用操作

2022-08-17 14:01:42

前言

說到物件導向,大家都不陌生。關係型資料庫也是後端日常用來儲存資料的,但資料庫是關係型的,因此,ORM通過物件模型和資料庫的關係模型之間建立對映,我們就能像操作物件一樣來運算元據庫。 ORM的優點主要是物件導向程式設計,不需寫原生SQL,用操作物件的方式存取資料。當然,缺點就是當遇到複雜的操作時,ORM就不那麼好寫了,還有就是加了一層對映,執行效率低於原生sql。不過,對於大部分專案來說,這些缺點都是可以接受的。犧牲的效能可以接受;有複雜操作時,實現就用原生SQL,ORM執行罷了。

flask sqlalchemy的設定使用

在python中,常用的ORM工具就是sqlalchemy了。下面就以一個簡單的flask例子來說明吧。

首先,寫一個最簡單的flask專案,程式碼如下:

from flask import Flask

app = Flask(__name__)
@app.route('/')
def orm_test():
    return "hello"

接下來我們匯入ORM設定,新增如下程式碼:

from flask_sqlalchemy import SQLAlchemy

def orm_config():
    url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8"
    orm_conf = {
        'SQLALCHEMY_DATABASE_URI': url
    }
    return orm_conf

# ORM 設定
app.config.from_mapping(orm_config)
db = SQLAlchemy(app)

這樣我們就將ORM設定OK了。

  • 然後我們新增一個表table1的model
# model表名
class Table1(db.Model):
    # 表名
    __tablename__ = "table1"

    id = db.Column(db.Integer, primary_key=True)
    col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義')

以上設定這是在資料來源只有一個庫的時候,但很多時候我們還需要存取別的庫,這時需要在ORM設定和model上做一些設定。

ORM設定中需要用到SQLALCHEMY_BINDS來新增資料庫, model中__bind_key__來指定資料庫了。

具體修改如下:

修改ORM設定:

def orm_config():
    url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8"
    # 指定的別庫
    other_url = "mysql+mysqlconnector://{user1}:{pwd1}@{host1}:{port1}/{db_name1}?charset=utf8"
    orm_conf = {
        'SQLALCHEMY_DATABASE_URI': url,
        # 新增別庫
        "SQLALCHEMY_BINDS":{
                "other_db":other_url
            },
    }
    return orm_conf

表model指定庫:

class Table2(db.Model):
    # 指定別庫
    __bind_key__ = 'other_db'
    __tablename__ = "table2"
    
    id = db.Column(db.Integer, primary_key=True)
    col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義')

最後,我們在介面中使用下ORM。

@app.route('/')
def orm_test():
    # 查詢table1資料
    rows = Table1.query.filter(Table1.id<5)
    res = []
    for row in rows:
        dict = {
            "id": row.id,
            "col": row.col
        }
        res.append(dict)
    return "hhh"

當我們遇到複雜操作,不知道ORM語法該怎麼寫時,還可以直接用原生sql + ORM session execute的方式執行,範例如下:

sql = "select count(*) as cnt from table1 group by col"
rows = db.session.execute(sql)

以上例子我們是查詢table1表的id<5的資料。

完整程式碼如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
def orm_config():
    url = "mysql+mysqlconnector://{user}:{pwd}@{host}:{port}/{db_name}?charset=utf8"
    other_url = "mysql+mysqlconnector://{user1}:{pwd1}@{host1}:{port1}/{db_name1}?charset=utf8"
    orm_conf = {
        'SQLALCHEMY_DATABASE_URI': url,
        "SQLALCHEMY_BINDS":{
                "other_db":other_url
            },
    }
    return orm_conf

# ORM 設定
app.config.from_mapping(orm_config)
db = SQLAlchemy(app)

# model表名
class Table1(db.Model):
    # 表名
    __tablename__ = "table1"

    id = db.Column(db.Integer, primary_key=True)
    col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義')

class Table2(db.Model):
    # 指定庫
    __bind_key__ = 'other_db'
    __tablename__ = "table2"

    id = db.Column(db.Integer, primary_key=True)
    col = db.Column(db.String(64), nullable=False, unique=True, comment='欄位釋義')

@app.route('/')
def orm_test():
    # 查詢table1資料
    rows = Table1.query.filter(Table1.id<5)
    res = []
    for row in rows:
        dict = {
            "id": row.id,
            "col": row.col
        }
        res.append(dict)
    return "hhh"
if __name__ =="__main__":
    app.run()

sqlalchemy的增刪改查

剛開始接觸sqlalchemy時,對於語法不熟悉,寫程式碼也是比較痛苦的。這裡總結下sqlalchemy常用的語法吧。

查詢資料

# 查詢id<5的資料
q = Table1.query.filter(Table1.id<5)
# 查詢過濾用 and、or
from sqlalchemy import and_, or_
q = Table1.query.filter(and_(Table1.id<5, Table1.col=='掘金'))
q = Table1.query.filter(or_(Table1.id<5, Table1.col=='掘金'))
# 查詢過濾用in(語法:model.{欄位名}.in_({列表}))
q = Table1.query.filter(Table1.id.in_([1,2,3]))
# 連表查詢
q = Table1.query.join(Table2, Table2.id==Table1.id) 
                   .filter(Table1.id<5)

# 解析資料
res = {'data': [dict(i) for i in q]}
# 查詢資料count
count = q.count()

增加資料

row = Table1(id=1, col='掘金')
db.session.add(row)
db.seesion.commit()

修改資料

 row = Table1.query.filter(Table1.id<5)
 update_data = {"col": "掘金"}
 row.update(update_data)
 db.session.commit()

刪除資料

row = Table1.query.filter(Table1.id<5)
row.delete()
db.session.commit()

備註: 增刪改都要commit()

總結

我們在工程程式碼中使用sqlalchemy時,在設定時記得根據實際情況新增相關設定引數,比如連線池的數量、自動回收連線的秒數等等。

到此這篇關於Python flask sqlalchemy的簡單使用及常用操作的文章就介紹到這了,更多相關Python flask sqlalchemy內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com