FlaskSQLAlchemy的create\u all不创建表

2024-03-29 08:10:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个flask应用程序,试图隔离我的单元测试。我使用的是flask sqlalchemy,我试图在运行测试之后使用create_all和{}方法来清理数据库。在

但是,似乎我的create_alldrop_all方法实际上并没有像文档所述那样创建/删除表。在调用create_all之前,我在应用程序中导入了我的模型,就像大多数其他答案所说的那样。在

以下代码是我遇到的错误:

psycopg2.ProgrammingError: relation "tasks" does not exist

这是我的相关代码

/app.py

^{pr2}$

/tests/test_router.py

from unittest import TestCase

from flask import Flask
from app import app, db
from src.models import Task

class TestRouter(TestCase):

    def setUp(self):
        db.create_all()

    def tearDown(self):
        db.drop_all()

    def test_adds_task(self):
        task = Task(task_id='task_1', name='my task')
        db.session.add(task)
        db.session.commit()

Tags: 方法代码frompyimportselfapp应用程序
1条回答
网友
1楼 · 发布于 2024-03-29 08:10:28

我想我很快就提出了这个问题,但我希望这可能会帮助其他人想出解决类似问题的其他想法。在

在我保存模型的src/models.py文件中,您必须确保您的模型定义正确。由于Flask SQLAlchemy是SQLAlchemy的包装器,因此必须使用db对象下的数据类型。在

基本上,我的模型是这样定义的:

class Task(db.Model):
    __tablename__ = 'tasks'

    id = Column(Integer, primary_key=True)
    task_id = Column(String)
    name = Column(String)
    created_at = Column(DateTime, default=datetime.datetime.now)

如您所见,我继承的是db.Model,而不是{}的返回值。我还需要在所有数据类型前面添加db.,包括ColumnIntegerStringFloatDateTimerelationship,和{}。在

因此,我可以通过将模型更改为以下内容来解决我的问题:

^{pr2}$

参见:Documentation on declaring Flask-SQLAlchemy models

相关问题 更多 >