Flask SQLAlchemy操作數(shù)據(jù)庫
1、Flask連接數(shù)據(jù)庫:
(1)安裝flask_sqlalchemy
模塊:
pip install flask_sqlalchemy
(2)設(shè)置配置信息:在config.py
文件中添加配置信息:
DIALECT = 'mysql' 數(shù)據(jù)庫類型
DRIVER = 'pymysql' 數(shù)據(jù)庫的驅(qū)動(dòng)
USERNAME = 'root' 數(shù)據(jù)庫的用戶名
PASSWORD = '123456' 數(shù)據(jù)庫密碼
HOST = 'localhost'
PORT = '3306' 數(shù)據(jù)庫的端口號(hào)
DATABASE = 'demo' 連接的數(shù)據(jù)庫名稱
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
注意:最后要將這些數(shù)據(jù)指向一個(gè)變量SQLALCHEMY_DATABASE_URI
python3
中數(shù)據(jù)庫的驅(qū)動(dòng)選擇pymysql
,Python2
中選擇mysqldb
(3)在主app中初始化和配置數(shù)據(jù)庫的配置信息:
使用flask_sqlalchemy
中的SQLALchemy
類進(jìn)行初始化和配置:
- 導(dǎo)入
flask_sqlalchemy
模塊的SQLALchemy
類
- 導(dǎo)入
config.py
中的模塊
from flask_sqlalchemy import SQLAlchemy
improt config
app.config.from_object(config)
db = SQLAlchemy(app)
(4)檢測Flask是否成功連接數(shù)據(jù)庫:
db.create_all()
沒有報(bào)錯(cuò)則說明連接數(shù)據(jù)庫成功
2艳丛、SQLALchemy模型和表格的映射:
(1)模型的繼承:
模型需要繼承自db.Model
,然后需要映射表中的屬性恬偷,需要寫成db.Column
的數(shù)據(jù)類型
(2)數(shù)據(jù)類型:
-
db.Integer
代表的是整型數(shù)據(jù)缆镣;
-
db.String
代表的是varchar
戚扳,并且需要指定其最長的長度蝌箍,例如:db.String(100)
-
db.Text
代表的是據(jù)庫中的text
類型
(3)其他的數(shù)據(jù)庫參數(shù):
-
primary_key
:代表的是這個(gè)字段是否設(shè)置成為主鍵么翰;
-
autoincrement
:代表的是這個(gè)主鍵是否為自增長的牺汤;
-
nullable
:代表的是這個(gè)字段是否允許為空,默認(rèn)可以為空浩嫌,值為False
時(shí)檐迟,為非空
(4)將模型真正地創(chuàng)建到數(shù)據(jù)庫中:
db.create_all()
(5)例如:創(chuàng)建一個(gè)article的模型(表):
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(100),nullable=False)
content = db.Column(db.Text,nullable=False)
db.create_all()
3、用SQLAlchemy對已存在數(shù)據(jù)庫的操作:
- 實(shí)際上码耐,使用SQLAlchemy對已存在的數(shù)據(jù)庫和重新創(chuàng)建的數(shù)據(jù)庫的方法是相同的:
查看表的構(gòu)造:
desc table_name;
disc_website.png
在Flask工程文件中構(gòu)造對象模型:
website_class.png
查詢表中的數(shù)據(jù):
result = Website.query.filter().all()
渲染在網(wǎng)頁上:
jinja_web.png
四追迟、創(chuàng)建兩個(gè)表之間的關(guān)系和外鍵約束:
1、外鍵約束:
- 定義一個(gè)
User
表的模型:
class User(db.Model):
__tablename__ = 'user_table'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(10),nullable=False)
- 定義一個(gè)
Article
的表的模型:
class Article(db.Model):
__tablename__ = 'article table'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
title = db.Column(db.String(10),nullable=False)
content = db.Column(db.Text,nullable=False)
author_id = db.Column(db.Integer,db.ForeignKey('user_table.id'))
-
author_id
為User
表對Article
表的外鍵約束骚腥,Foreignkey
方法傳入的參數(shù)是模型的表名敦间,外鍵的字段類型必須和外鍵表中的字段類型保持一致
2、創(chuàng)建兩個(gè)表中的關(guān)系:
- 創(chuàng)建關(guān)系:
author = db.relationship('User',backref=db.backref('articles'))
給
Article
模型創(chuàng)建一個(gè)author
的屬性束铭,可以利用這個(gè)屬性通過article.author
來訪問到User
模型中的作者屬性廓块,在通過.username
的屬性,可以查找到這個(gè)作者的作者名backref
是定義反向引用契沫,可以通過user_pushy.articles.content
來查找到這個(gè)作者的文章內(nèi)容例如:查找所有文章的標(biāo)題為‘a(chǎn)aa’的作者:
article_aaa = Article.query.filter(Article.title == 'aaa').first()
print(article_aaa.author.username)
找到用戶名為'Pushy'寫的文章的內(nèi)容:
article_pushy = User.query.filter(User.username =='Pushy').first()
# 得到的result為列表類型:
result = article_pushy.articles[0]
print(result.content)