看不到.db文件Flask SQLAlchemy

问题描述 投票:0回答:3

我正在学习如何使用 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)
python flask sqlalchemy flask-sqlalchemy
3个回答
2
投票

这是因为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)
);

0
投票

Flask 中有一个名为

@app.before_first_request
的装饰器。 您可以使用它来创建一个函数,在服务器中发生任何请求之前创建数据库文件,并且应该自动创建数据库文件。

@app.before_first_request
def create_tables():
    db.create_all()

0
投票

如果仍然遇到问题,可以尝试为数据库文件指定绝对路径,以避免相对路径问题。

app.config['SQLALCHEMY_DATABASE_URI'] = "sqlite:///{path.abspath('market.db')}"
© www.soinside.com 2019 - 2024. All rights reserved.