在flask中,我们使用Flask-SQLAlchemy管理数据库,第一步是在给定的数据库中创建数据表,通过建立好模型之后,通过create_all命令即可把所有的继承db.Model的数据表类在数据库中创建。语句如下
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:root@localhost:3306/flask_test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
app.config['SQLALCHEMY_ECHO'] = True
db=SQLAlchemy(app)
class Role(db.Model):
__tablename__='roles'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
class User(db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
role_id=db.Column(db.Integer,db.ForeignKey('roles.id'))
@app.route('/',methods=['post','get'])
def index():
return 'hello'
if __name__=='__main__':
db.drop_all()
db.create_all()
app.run(debug=True)
但是当我们执行程序的时候却发现,程序未报错,但是数据库中也没有增加数据表。然后在很多入门视频教程里都是这么写的。这是因为create_all放在main方法中,但是运行此程序时并不会执行main方法。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app=Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:root@localhost:3306/flask_test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS']=False
app.config['SQLALCHEMY_ECHO'] = True
db=SQLAlchemy(app)
class Role(db.Model):
__tablename__='roles'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
class User(db.Model):
__tablename__='users'
id=db.Column(db.Integer,primary_key=True)
name=db.Column(db.String(16),unique=True)
role_id=db.Column(db.Integer,db.ForeignKey('roles.id'))
@app.route('/',methods=['post','get'])
def index():
return 'hello'
# 删除表
db.drop_all()
# 创建表
db.create_all()
if __name__=='__main__':
app.run(debug=True)
解决方法:将如下两条语句放在main方法之外即可。
db.drop_all()
db.create_all()