文章目录
- 安装
- 介绍
- SQLAlchemy的使用
- 1. SQLAlchemy初始化
- 2. 数据库的配置,在`config.py`文件中
- 3. 在`app.py`添加配置文件
- 4. 进行测试
- 创建模型与表的映射
- 1.模型的继承
- 2.模型的创建
- ORM的增删查改
- 1.增
- 2.查
- 3.改
- 4.删除
- ORM的外键和关系(一对多)
- flask中遇到的models和循环引用
安装
pip install flask-sqlalchemy
介绍
- ORM:模型关系映射
- flask-sqlalchemy:是一套ORM框架
- ORM:可以让我们操作数据库跟操作对象是一样的,一个表就抽象成一个类,一条数据就抽象为改类的对象。就不需要写SQL语句,直接操纵对象就可以。
SQLAlchemy的使用
1. SQLAlchemy初始化
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
2. 数据库的配置,在config.py
文件中
import os
DEBUG = True
SECRET_KEY = os.urandom(24) # session_key设置
DIALECT = 'mysql'
DRIVER = 'pymysql'
USERNAME = 'root'
PASSWORD = ''
HOST = '127.0.0.1'
PORT = '3306'
DATABAES = 'flask_demo'
SQLALCHEMY_DATABASE_URI = '{}+{}://{}:{}@{}:{}/{}'.format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABAES)
SQLALCHEMY_TRACK_MODIFICATIONS = False
3. 在app.py
添加配置文件
app = Flask(__name__)
app.config.from_object(config) # flask加载配置文件
db = SQLAlchemy(app)
4. 进行测试
app = Flask(__name__)
app.config.from_object(config) # flask配置sqlalchemy
db = SQLAlchemy(app)
db.create_all()
如果不报错的话,就是初始化成功。
创建模型与表的映射
1.模型的继承
- 模型需要继承
db.Modeal
,需要映射到表中的属性,必须写成db.Column
的数据类型。
- 常见数据类型
-
db.Integer
整形 -
db.String
代表varchar
需要指定长度 -
db.Text
代表Text
-
db.Datetime
时间类型,python中用datetime.datetime
表示
- 常见列属性
-
primary_key
:True代表改列为表的主键 -
nullable
:True代表允许为空 -
default
:列的默认值 -
index
:True代表列的索引 -
unique
:True不允许相同的值 -
autoincrement
:代表主键是自增长的
2.模型的创建
将模型创建到数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = Flask(__name__)
app.config.from_object(config) # flask配置sqlalchemy
db = SQLAlchemy(app)
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()
@app.route('/')
def index():
return 'index'
def main():
app.run(debug=True)
if __name__ == '__main__':
main()
ORM的增删查改
1.增
# 增加
article1 = Article(title='a', content='内容')
db.session.add(article1)
# 事务的操作
db.session.commit()
2.查
# # 查
result = Article.query.filter(Article.title == 'a').first()
print(result.title)
print(result.content)
result = Article.query.filter(Article.title == 'a').all()
print(result[0].title)
print(result[0].content)
3.改
# 改
# 先查询数据,再更改数据,事务的提交
result = Article.query.filter(Article.title == 'a').first()
result.title = 'new title'
db.session.commit()
4.删除
# 查询数据,删除数据,事务提交
result = Article.query.filter(Article.content == '内容').first()
db.session.delete(result)
db.session.commit()
ORM的外键和关系(一对多)
一对多的关系,创建两个表User
和Article
。
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
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)
author_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 关联外键
author = db.relationship('User', backref=db.backref('articles')) # 定义关系,第一个定义模型的名字,一对多
author = db.relationship('User', backref=db.backref('articles'))
:的意思是给Article
模型添加一个author
属性,可以访问这篇作者的数据,backref
定义是反向引用,可以通过User.articles
访问User用户所写的所有文章。
flask中遇到的models和循环引用
会产生错误ImportError: cannot import name 'Article' from 'models'
产生循环引用。
- 分开models目的:方便代码的管理
- 如何解决循环引用:把
db
放在一个单独文件中,切段循环引用的线条。
创建一个文件exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
在models.py
文件中from exts import db
在app.py
文件中
from exts import db
db.init_app(app) # 解决循环引用问题