在Flask中使用Flask sqlalchemy
时出现的循环引用
将数据库的model单独写在一个文件中,Model类需要继承db.Model,而主文件中需要注册数据库,这样会导致在主文件中引用model,在model中引用主文件的db,造成循环引用。
解决办法是把db单独写在一个文件中,然后主文件引用db并注册,model也引用db
目录结构为:
数据库文件写在database目录下的exts.py中
exts.py文件:
from flask_sqlalchemy import SQLAlchemy
#此时先不传入app
db = SQLAlchemy()
数据库的配置文件写在config.py文件中:
DIALECT='mysql'
DRIVER='mysqldb'
USERNAME='数据库用户名'
PASSWORD='数据库密码'
HOST='数据库主机地址'
PORT='数据库端口号'
DATABASE='数据库名称'
SQLALCHEMY_DATABASE_URI=DIALECT+'://'+USERNAME+':'+PASSWORD+'@'+HOST+':'+PORT+'/'+DATABASE
SQLALCHEMY_TRACK_MODIFICATIONS=False
使用
migrate管理数据库版本迁移:manager.py文件:
# coding:utf-8
from flask_script import Manager
from Chat import app,db
from flask_migrate import Migrate,MigrateCommand
from model.models import User,Message
manager=Manager(app)
migrate=Migrate(app,db)
manager.add_command('db',MigrateCommand)
if __name__=='__main__':
manager.run()
在主文件中导入相关文件,并初始化db:
from flask import Flask,request,render_template,jsonify
import config
from model.models import User
from database.exts import db
app = Flask(__name__)
app.config.from_object(config)
CORS(app, supports_credentials=True)
app.debug = True
db.init_app(app)
model文件:
# -*- coding: UTF-8 -*-
from database.exts import db
class User(db.Model):
__tablename__='user'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
name=db.Column(db.String(40),unique=True,nullable=False)
password=db.Column(db.String(32),nullable=False)
email=db.Column(db.String(40),nullable=False)
create_time=db.Column(db.String(20),nullable=False)
update_time=db.Column(db.String(20),nullable=False)
def __init__(self,name,password,email,create_time,update_time):
self.name=name
self.password=password
self.email=email
self.create_time=create_time
self.update_time=update_time
def __repr__(self):
return '<User {}>'.format(self.name)