一个小项目

2019-11-21  本文已影响0人  Noza_ea8f
image.png

发现如果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,用于创建数据库,

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中写业务逻辑就行了

上一篇下一篇

猜你喜欢

热点阅读