flask SQLAlchemy連接數(shù)據(jù)庫及操作的實(shí)現(xiàn)
介紹
flask介紹
Flask是一個輕量級的Python Web框架,它基于Werkzeug和Jinja2庫構(gòu)建,因其簡潔、靈活、易擴(kuò)展等特性而廣受歡迎。
Flask的核心設(shè)計(jì)理念是"micro",即"微型"。相比于其他大型的Web框架,F(xiàn)lask僅提供了最基本的功能集,如路由、請求與響應(yīng)處理、模板渲染等,但同時也允許開發(fā)者通過插件或擴(kuò)展來添加更多的功能。這種設(shè)計(jì)方式使得Flask非常適合構(gòu)建小型的Web應(yīng)用程序、API服務(wù)以及原型驗(yàn)證等場景。
除此之外,F(xiàn)lask還具有以下優(yōu)點(diǎn):
- 簡單易學(xué):Flask的API設(shè)計(jì)非常簡單,易于掌握和使用。
- 高度靈活:Flask允許開發(fā)者根據(jù)實(shí)際需求自由選擇需要引入的插件或庫,從而實(shí)現(xiàn)高度靈活的定制化。
- 輕量級高效:Flask的核心代碼很小,運(yùn)行速度非??欤梢詰?yīng)對高并發(fā)的訪問。
- 豐富的擴(kuò)展庫:Flask擁有龐大的擴(kuò)展庫,涵蓋了數(shù)據(jù)庫、表單驗(yàn)證、用戶認(rèn)證、緩存等各個方面的功能。
總之,F(xiàn)lask是一個簡單、靈活、可擴(kuò)展的Python Web框架,適用于各種規(guī)模的Web應(yīng)用程序開發(fā)。它的設(shè)計(jì)思想和哲學(xué)使得開發(fā)者可以快速上手、高效開發(fā),并且能夠根據(jù)實(shí)際需求進(jìn)行自由擴(kuò)展。
SQLAlchemy介紹
SQLAlchemy是一個Python的ORM(對象關(guān)系映射)工具,它提供了一種將關(guān)系數(shù)據(jù)庫映射到Python對象的方式。ORM是一種編程模式,使得我們可以通過使用面向?qū)ο蟮恼Z法來操作關(guān)系型數(shù)據(jù)庫,從而抽象出底層的SQL查詢。
SQLAlchemy提供了一種高級、Pythonic的接口,讓程序員能夠使用Python代碼進(jìn)行數(shù)據(jù)庫操作,而無需直接編寫SQL。同時,它還提供了對多個關(guān)系數(shù)據(jù)庫的支持,包括MySQL、PostgreSQL、Oracle、Microsoft SQL Server等。
SQLAlchemy提供兩種不同的API:Core API和ORM API。Core API提供了底層的SQL表達(dá)式和查詢構(gòu)建,ORM API則提供了更高級別的面向?qū)ο蟮臄?shù)據(jù)訪問和持久化。
使用SQLAlchemy,開發(fā)者可以輕松地創(chuàng)建和管理數(shù)據(jù)庫表、執(zhí)行復(fù)雜的查詢、實(shí)現(xiàn)事務(wù)處理、維護(hù)數(shù)據(jù)完整性等。它還支持連接池、線程安全、自動回滾等特性,以提高應(yīng)用程序的性能和可靠性。
總之,SQLAlchemy是一個強(qiáng)大、靈活、易于使用的Python ORM框架,是Python開發(fā)者在處理關(guān)系型數(shù)據(jù)庫時不可或缺的工具之一。
Flask-SQLAlchemy介紹
Flask-SQLAlchemy是一個為Flask應(yīng)用程序提供SQLAlchemy支持的擴(kuò)展,它通過將SQLAlchemy集成到Flask中,讓開發(fā)者可以更加方便地使用ORM(對象關(guān)系映射)模型來操作數(shù)據(jù)庫。
Flask-SQLAlchemy提供了一種面向?qū)ο蟮姆绞絹硖幚頂?shù)據(jù)庫,用戶可以通過定義Python類來映射數(shù)據(jù)庫表格。這些類通常被稱為“模型”,每個模型對應(yīng)一個數(shù)據(jù)庫表格,其中類屬性對應(yīng)表格的列。
Flask-SQLAlchemy的主要特性包括:
- 簡單易用:Flask-SQLAlchemy提供了簡潔、易于理解和學(xué)習(xí)的API,用戶可以快速上手并開始構(gòu)建數(shù)據(jù)庫模型。
- 數(shù)據(jù)庫遷移:Flask-SQLAlchemy支持集成Flask-Migrate擴(kuò)展實(shí)現(xiàn)數(shù)據(jù)庫結(jié)構(gòu)的自動遷移,以方便管理數(shù)據(jù)庫結(jié)構(gòu)的變化。
- 數(shù)據(jù)庫會話管理:Flask-SQLAlchemy在Flask應(yīng)用中提供了SQLAlchemy的會話管理功能,開發(fā)者可以輕松地進(jìn)行數(shù)據(jù)庫操作。
- 查詢優(yōu)化:Flask-SQLAlchemy提供了靈活的查詢API,支持多種查詢方式和過濾器,開發(fā)者可以根據(jù)實(shí)際需求自由選擇。
總之,F(xiàn)lask-SQLAlchemy是一個非常強(qiáng)大、靈活且易于使用的ORM框架,對于使用Flask框架的Web應(yīng)用程序開發(fā)人員而言,它是一個不可或缺的工具。使用Flask-SQLAlchemy,開發(fā)者可以更加方便、高效地實(shí)現(xiàn)數(shù)據(jù)持久化,同時也可以避免手動編寫低效和容易出錯的SQL語句。
連接步驟
使用Flask-SQLAlchemy,需要先安裝Flask和SQLAlchemy以及Flask-SQLAlchemy擴(kuò)展??梢允褂胮ip命令來安裝它們:
pip install flask pip install sqlalchemy pip install flask_sqlalchemy
安裝完成后,可以按照以下步驟使用Flask-SQLAlchemy:
1.在Flask應(yīng)用程序中導(dǎo)入flask_sqlalchemy模塊并創(chuàng)建一個SQLAlchemy對象:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app)
2.創(chuàng)建數(shù)據(jù)庫模型(也稱為“表”),定義一個繼承自db.Model的Python類,并將類屬性定義為列。例如,下面的代碼定義了一個名為User的模型:
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False)
3.創(chuàng)建數(shù)據(jù)庫表格,可以使用Flask-Migrate擴(kuò)展來進(jìn)行數(shù)據(jù)庫遷移管理。例如,可以運(yùn)行以下命令創(chuàng)建遷移腳本:
flask db init #初始化,只需要一次 flask db migrate #只要更改上邊的模型了,就需要執(zhí)行這條和下條命令 flask db upgrade
4.使用數(shù)據(jù)庫,可以使用db.session來進(jìn)行數(shù)據(jù)庫操作。例如,下面的代碼將創(chuàng)建一個新的用戶:
new_user = User(username='xiaogao', email='1443004194@qq.com') db.session.add(new_user) db.session.commit()
5.在Flask應(yīng)用程序中使用數(shù)據(jù)庫,可以在Flask視圖函數(shù)中使用數(shù)據(jù)庫進(jìn)行數(shù)據(jù)查詢、更新等操作。例如,下面的代碼查詢所有的用戶并將它們渲染到HTML頁面中:
@app.route('/users') def users(): all_users = User.query.all() return render_template('users.html', users=all_users)
增刪改查操作
1.增加數(shù)據(jù)
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 定義數(shù)據(jù)表類 class User(db.Model): ? ? __tablename__ = 'user' ? ? id = db.Column(db.Integer, primary_key=True) ? ? name = db.Column(db.String(50)) ? ? age = db.Column(db.Integer) # 創(chuàng)建新用戶 new_user = User(name='John', age=30) # 添加到session并提交 db.session.add(new_user) db.session.commit()
2.查詢數(shù)據(jù)
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 定義數(shù)據(jù)表類 class User(db.Model): ? ? __tablename__ = 'user' ? ? id = db.Column(db.Integer, primary_key=True) ? ? name = db.Column(db.String(50)) ? ? age = db.Column(db.Integer) #根據(jù)id查詢 user=User.query.get(1)#查詢id為1的用戶 ? ?? # 查詢所有用戶 all_users = User.query.all() #遍歷 for user in all_users: ?? ?print(f'{user.id}:{user.name}:{user.age}') ? ?? # 查詢指定用戶 user = User.query.filter_by(name='John').first() # 查詢年齡在20到30之間的用戶 users = User.query.filter(User.age >= 20, User.age <= 30).all()
3.修改數(shù)據(jù)(更新數(shù)據(jù))
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 定義數(shù)據(jù)表類 class User(db.Model): ? ? __tablename__ = 'user' ? ? id = db.Column(db.Integer, primary_key=True) ? ? name = db.Column(db.String(50)) ? ? age = db.Column(db.Integer) # 查詢需要修改的用戶 user = User.query.filter_by(name='John').first() # 修改用戶信息 user.age = 35 # 提交修改 db.session.commit()
4.刪除數(shù)據(jù)
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 定義數(shù)據(jù)表類 class User(db.Model): ? ? __tablename__ = 'user' ? ? id = db.Column(db.Integer, primary_key=True) ? ? name = db.Column(db.String(50)) ? ? age = db.Column(db.Integer) # 查詢需要刪除的用戶 user = User.query.filter_by(name='John').first() # 刪除用戶 db.session.delete(user) # 提交刪除 db.session.commit()
外鍵綁定與ORM關(guān)系映射
1.一對一關(guān)系
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) # 定義數(shù)據(jù)表類 class User(db.Model): ? ? __tablename__ = 'user' ? ? id = db.Column(db.Integer, primary_key=True) ? ? name = db.Column(db.String(50)) ? ? age = db.Column(db.Integer) class Post(db.Model): ? ? __tablename__ = 'post' ? ? id = db.Column(db.Integer, primary_key=True) ? ? title = db.Column(db.String(50)) ? ? content = db.Column(db.Text) # Post表的user_id外鍵綁定User表的id ? ? user_id = db.Column(db.Integer, db.ForeignKey('user.id')) ?? ? ? ?? # 根據(jù)用戶創(chuàng)建帖子 user = User(name='John', age=30) db.session.add(user) db.session.commit() post = Post(title='Hello World', content='This is my first post.', user_id=user.id) db.session.add(post) db.session.commit() # 查詢帖子及其對應(yīng)的用戶信息 post = Post.query.first() print(post.title) print(post.user.name)
User類包含了一個posts屬性,指向了與該用戶相關(guān)的所有帖子。而Post類包含了一個user屬性,指向了創(chuàng)建該帖子的用戶。通過這種方式,可以在Python對象之間建立關(guān)系,方便進(jìn)行查詢和操作。
2.一對多關(guān)系
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 數(shù)據(jù)庫配置 HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'flask_study' USERNAME = 'root' PASSWORD = 'root' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) class User(db.Model): ? ? id = db.Column(db.Integer, primary_key=True) ? ? name = db.Column(db.String(50)) ? ? profile = db.relationship('Profile', backref='user', uselist=False) ? ? # db.backref ? ? # 1. 在反向引用的時候,如果需要傳遞一些其他的參數(shù),那么就需要用到這個函數(shù),否則不需要使用,只要在relationship的backref參數(shù)上,設(shè)置反向引用的名稱就可以了。 ? ? # 2. uselist=False:代表反向引用的時候,不是一個列表,而是一個對象。 ? ?? class Post(db.Model): ? ? id = db.Column(db.Integer, primary_key=True) ? ? title = db.Column(db.String(100)) ? ? content = db.Column(db.Text) ? ? user_id = db.Column(db.Integer, db.ForeignKey('user.id')) ? ?? user = User(name='John') post = Post(title='Hello World', content='This is my first post.') user.posts.append(post) db.session.add(user) db.session.commit()
Post模型通過user_id外鍵引用User模型。在User模型中,我們使用posts屬性定義了與Post模型的關(guān)系,并使用backref參數(shù)創(chuàng)建一個名為user的反向引用。這樣,我們可以通過user.posts從任何一個用戶對象訪問其所有文章對象。
到此這篇關(guān)于flask SQLAlchemy連接數(shù)據(jù)庫及操作的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)flask SQLAlchemy連接數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3與fastdfs分布式文件系統(tǒng)如何實(shí)現(xiàn)交互
這篇文章主要介紹了Python3與fastdfs分布式文件系統(tǒng)如何實(shí)現(xiàn)交互,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Python操作多維數(shù)組輸出和矩陣運(yùn)算示例
這篇文章主要介紹了Python操作多維數(shù)組輸出和矩陣運(yùn)算,結(jié)合實(shí)例形式分析了Python多維數(shù)組的生成、打印輸出及矩陣運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2019-11-11利用Pandas 創(chuàng)建空的DataFrame方法
下面小編就為大家分享一篇利用Pandas 創(chuàng)建空的DataFrame方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python?matplotlib之折線圖的各種樣式與畫法總結(jié)
matplotlib是Python中的一個第三方庫,主要用于開發(fā)2D圖表,以漸進(jìn)式、交互式的方式實(shí)現(xiàn)數(shù)據(jù)可視化,可以更直觀的呈現(xiàn)數(shù)據(jù),使數(shù)據(jù)更具說服力,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib之折線圖的各種樣式與畫法的相關(guān)資料,需要的朋友可以參考下2022-12-12