我正在学习如何使用 Flask 创建一个简单的 Web 应用程序,并且正在学习本课程 (https://www.youtube.com/watch?v=Qr4QMBUPxWo&t=2499s&ab_channel=freeCodeCamp.org)
现在,我正在尝试创建数据库并按照视频中显示的步骤操作,但我无法在文件夹中看到 .db 文件。
我无法创建视频中所示的数据库,但我通过进入 python 终端并使用以下命令创建了它:
$ 来自市场导入应用程序,db
$ app.app_context().push()
$ db.create_all()
我现在的代码如下:
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///market.db'
db = SQLAlchemy(app)
class Item(db.Model):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(length=30), nullable=False, unique=True)
price = db.Column(db.Integer(), nullable=False)
barcode = db.Column(db.String(length=12), nullable=False, unique=True)
description = db.Column(db.String(length=1024), nullable=False, unique=True)
def __repr__(self):
return f'Item {self.name}'
@app.route('/')
@app.route('/home')
def home_page():
return render_template('home.html')
@app.route('/about/<username>')
def about_page(username):
return f'<h1>This is the about page of {username}</h1>'
@app.route('/market')
def market_page():
items = Item.query.all()
return render_template('market.html', items=items)
这是因为sqlite文件的路径是绝对路径。尝试相应地构建它:
from pathlib import Path
...
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{Path(__file__).parent / 'market.db'}"
调用命令
db.create_all()
后,我们将看到在python文件所在的目录中创建了db。
$ ls *.db
market.db
我们可以验证它是否是使用
sqlite3
cli 命令声明的确切架构:
$ sqlite3 market.db
SQLite version 3.37.0 2021-12-09 01:34:53
Enter ".help" for usage hints.
sqlite> .tables
item
sqlite> .schema item
CREATE TABLE item (
id INTEGER NOT NULL,
name VARCHAR(30) NOT NULL,
price INTEGER NOT NULL,
barcode VARCHAR(12) NOT NULL,
description VARCHAR(1024) NOT NULL,
PRIMARY KEY (id),
UNIQUE (name),
UNIQUE (barcode),
UNIQUE (description)
);
Flask 中有一个名为
@app.before_first_request
的装饰器。
您可以使用它来创建一个函数,在服务器中发生任何请求之前创建数据库文件,并且应该自动创建数据库文件。
@app.before_first_request
def create_tables():
db.create_all()
如果仍然遇到问题,可以尝试为数据库文件指定绝对路径,以避免相对路径问题。
app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///{path.abspath('market.db')}"