基于数据库的Flask炼金术wtform

2024-09-27 00:19:03 发布

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

我的应用程序正在我的主电脑上运行。我试图将应用程序克隆到我的笔记本电脑上(我试图在另一个目录下的PC上初始化它,但问题是相同的,所以问题不是在笔记本电脑上),当用flask db init初始化数据库时,我得到了以下错误:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: race [SQL: 'SELECT race.id AS race_id, race.name AS race_name \nFROM race'] (Background on this error at: http://sqlalche.me/e/e3q8)

我要做的是在我的一个表单中包含一个wtforms RadioField,其中的选项基于db中的race表。所以对于表中的每一行,我希望在选择中有一个选择。表单的重要部分如下所示:

^{pr2}$

races变量在表单之外,如下所示(在表单之前):

with create_app().app_context():
    races = [(race.id, race.name.capitalize()) for race in Race.query.all()]

我想最后一行是调用堆栈的问题:

Traceback (most recent call last):
  File "/home/dareon4/workspace/test/venv/bin/flask", line 11, in <module>
    sys.exit(main())
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/flask/cli.py", line 894, in main
    cli.main(args=args, prog_name=name)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/flask/cli.py", line 557, in main
    return super(FlaskGroup, self).main(*args, **kwargs)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/flask/cli.py", line 411, in decorator
    with __ctx.ensure_object(ScriptInfo).load_app().app_context():
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/flask/cli.py", line 372, in load_app
    app = locate_app(self, import_name, name)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/flask/cli.py", line 235, in locate_app
    __import__(module_name)
  File "/home/dareon4/workspace/test/shapes.py", line 5, in <module>
    app = create_app()
  File "/home/dareon4/workspace/test/app/__init__.py", line 43, in create_app
    from app.blueprints.auth import bp as auth_bp
  File "/home/dareon4/workspace/test/app/blueprints/auth/__init__.py", line 7, in <module>
    from . import routes
  File "/home/dareon4/workspace/test/app/blueprints/auth/routes.py", line 13, in <module>
    from .forms import LoginForm, RegistrationForm, ResetPasswordRequestForm, \
  File "/home/dareon4/workspace/test/app/blueprints/auth/forms.py", line 19, in <module>
    races = [(race.id, race.name.capitalize()) for race in Race.query.all()]
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/orm/query.py", line 2836, in all
    return list(self)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/orm/query.py", line 2988, in __iter__
    return self._execute_and_instances(context)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/orm/query.py", line 3011, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 948, in execute
    return meth(self, multiparams, params)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1200, in _execute_context
    context)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
    exc_info
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/util/compat.py", line 248, in reraise
    raise value.with_traceback(tb)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/engine/base.py", line 1193, in _execute_context
    context)
  File "/home/dareon4/workspace/test/venv/lib64/python3.6/site-packages/sqlalchemy/engine/default.py", line 509, in do_execute
    cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: race [SQL: 'SELECT race.id AS race_id, race.name AS race_name \nFROM race'] (Background on this error at: http://sqlalche.me/e/e3q8)

所以问题是我在运行flask db init命令时没有初始化数据库,而且有一行需要数据库存在。这可能没有一个解决方案,所以我并不是要问如何更正这个实现,而是如何正确地实现基于数据库行的表单。我没有几百场比赛,所以我可以硬编码,但我想这样做。在


Tags: inpytestapphomevenvsqlalchemypackages

热门问题