发现如果app在自己建的文件夹里,如果要引用模板,就需要把templates和static文件夹移动到这个文件夹,也就是说templates默认引用的是相对路径;
- 配置数据库
# 创建数据库对象
db = SQLAlchemy(app=app)
# 数据库配置
# 数据库地址
# app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv('DATABASE_URL', 'sqlite:///' + os.path.join(app.root_path, 'data.db'))
app.config['SQLALCHEMY_DATABSE_URI'] = 'sqlite:///db.sqlite3'
# 关闭数据跟踪修改
app.config['SQLALCHEMY_TRACE_MODIFICATIONS'] = False
新建一个python文件db.py,用于创建数据库,
-
添加书和作者模型
image.png -
添加数据
if __name__ == '__main__':
db.drop_all()
db.create_all()
# 生成数据
au1 = Author(name='罗贯中')
au2 = Author(name='曹雪芹')
au3 = Author(name='施耐庵')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='三国演义', author_id=au1.id)
bk2 = Book(name='红楼梦', author_id=au2.id)
bk3 = Book(name='水浒传', author_id=au3.id)
db.session.add_all([bk1, bk2, bk3])
db.session.commit()
manager.run()
按照视频写的上面代码,运行后会报错,说找不到表;
之后我新建了一个create_db.py表,用于创建数据;
from app import db, Author, Book
db.drop_all()
db.create_all()
# 生成数据
au1 = Author(name='罗贯中')
au2 = Author(name='曹雪芹')
au3 = Author(name='施耐庵')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='三国演义', author_id=au1.id)
bk2 = Book(name='红楼梦', author_id=au2.id)
bk3 = Book(name='水浒传', author_id=au3.id)
db.session.add_all([bk1, bk2, bk3])
db.session.commit()
执行后提示警告信息一样;
但是生成的db.db文件大小有了变化;
刷新网页显示出信息;
成功!
进一步拆分,把模型放到model.py
优化后的代码:
app.py
from datetime import timedelta
from flask import render_template, Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
from model import Author
app = Flask(__name__)
# 设置静态文件缓存过期时间
app.send_file_max_age_default = timedelta(seconds=1)
# 创建数据库对象
db = SQLAlchemy(app=app)
# 数据库配置
app.config['SECRET_KEY'] = '123'
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.db'
# 关闭数据跟踪修改
app.config['SQLALCHEMY_TRACE_MODIFICATIONS'] = False
# 设置托管
manager = Manager(app=app)
@app.route('/')
def index():
# 查询作者信息传给模板
authors = Author.query.all()
return render_template('books.html', authors=authors)
if __name__ == '__main__':
manager.run()
model.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 创建数据库对象
db = SQLAlchemy(app=app)
# 数据库配置
app.config['SECRET_KEY'] = '123'
# 数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///db.db'
# 关闭数据跟踪修改
app.config['SQLALCHEMY_TRACE_MODIFICATIONS'] = False
# 定义书和作者模型
# 作者模型
class Author(db.Model):
# 表名
__tablename__ = 'authors'
# 字段名
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# 关系引用
# books是给自己用的,author是给Book模型用的
books = db.relationship('Book', backref='author')
def __repr__(self):
return 'Author:{}'.format(self.name)
# 书籍模型
class Book(db.Model):
__tablename__ = 'books'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey('authors.id'))
def __repr__(self):
return 'Book:{}{}'.format(self.name, self.id)
create_db.py
from app import db
from model import Author, Book
db.drop_all()
db.create_all()
# 生成数据
au1 = Author(name='罗贯中')
au2 = Author(name='曹雪芹')
au3 = Author(name='施耐庵')
# 把数据提交给用户会话
db.session.add_all([au1, au2, au3])
# 提交会话
db.session.commit()
bk1 = Book(name='三国演义', author_id=au1.id)
bk2 = Book(name='红楼梦', author_id=au2.id)
bk3 = Book(name='水浒传', author_id=au3.id)
db.session.add_all([bk1, bk2, bk3])
db.session.commit()
这样的话只需要在app中写业务逻辑就行了
- 使用模板显示数据库查询的数据
- 使用WTF显示表单
- 实现增删逻辑
网友评论