文章目录

  • 安装
  • 介绍
  • SQLAlchemy的使用
  • 1. SQLAlchemy初始化
  • 2. 数据库的配置,在`config.py`文件中
  • 3. 在`app.py`添加配置文件
  • 4. 进行测试
  • 创建模型与表的映射
  • 1.模型的继承
  • 2.模型的创建
  • ORM的增删查改
  • 1.增
  • 2.查
  • 3.改
  • 4.删除
  • ORM的外键和关系(一对多)

  • flask中遇到的models和循环引用


安装

pip install flask-sqlalchemy

介绍

  1. ORM:模型关系映射
  2. flask-sqlalchemy:是一套ORM框架
  3. 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.模型的继承
  1. 模型需要继承db.Modeal,需要映射到表中的属性,必须写成db.Column的数据类型。
  • 常见数据类型
  1. db.Integer整形
  2. db.String代表varchar需要指定长度
  3. db.Text代表Text
  4. db.Datetime时间类型,python中用datetime.datetime表示
  • 常见列属性
  1. primary_key:True代表改列为表的主键
  2. nullable:True代表允许为空
  3. default:列的默认值
  4. index:True代表列的索引
  5. unique:True不允许相同的值
  6. 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的外键和关系(一对多)

一对多的关系,创建两个表UserArticle

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'产生循环引用。

  1. 分开models目的:方便代码的管理
  2. 如何解决循环引用:把db放在一个单独文件中,切段循环引用的线条。

创建一个文件exts.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

models.py文件中from exts import dbapp.py文件中

from exts import db
db.init_app(app)    # 解决循环引用问题