如何让 Flask-SQLAlchemy 与应用程序工厂模式一起使用

2024-02-15

我想使用 Flask-SQLAlchemy 设置一个 sqlite 数据库。我收到操作错误(sqlite3.OperationalError) no such table.

这是一个用 Flask 编写的 Web 应用程序。我想使用 Flask-SQLAlchemy 扩展与数据库进行交互。我觉得这可能与应用程序上下文有关,但我不确定。

正如您所看到的,该应用程序有一个“模块”(auth子包)。该模块通过蓝图注册到应用程序。我定义的模型为Researcher类在models.py文件的auth子包。app/__init__.py保存应用程序工厂和数据库初始化。 因为我只是想让基本功能正常工作,所以我仅有的两个视图定义在app/auth/routes.py.


.
|-- app
|   |-- __init__.py
|   |-- auth
|   |   |-- __init__.py
|   |   |-- __pycache__
|   |   |-- models.py
|   |   `-- routes.py
|   |-- static
|   `-- templates
|-- app.db
|-- config.py
|-- instance
|   `-- config.py
`-- run.py

app/init.py

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def create_app():
    app = Flask(__name__)
    app.config.from_pyfile("../config.py")

    db.init_app(app)
    with app.app_context():
        db.create_all()

    from app.auth import auth
    app.register_blueprint(auth, url_prefix="/auth/")

    return app 

应用程序/auth/routes.py

from flask import Flask
from app import db
from models import User
from app.auth import auth

@auth.route("/insert")
def insert():
    #r = Reasearcher("Pat","Den", "[email protected] /cdn-cgi/l/email-protection", "operator","Dr.","Mr", "08611111", "+353", "0001")
    u = User(1,"Elija")
    db.session.add(u)
    db.session.commit()

@auth.route("/query")
def query():
    us = users.query.all()
    s = ""
    for u in us:
        s += u.name
    return s

应用程序/auth/models.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from app import db

class User(db.Model):
    __tablename__ = "users"

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

    def __init__(self,ids, name):
        self.id = ids
        self.name = name

应用程序/授权/init.py

from flask import Flask, Blueprint

auth = Blueprint("auth", __name__)

import routes
import models

配置文件

DEBUG = True

import os
BASE_DIR = os.path.abspath(os.path.dirname(__file__))

SQLALCHEMY_DATABASE_URI = "sqlite:////" + os.path.join(BASE_DIR, "app.db")
DATABASE_CONNECT_OPTIONS = {}
THREADS_PER_PAGE = 2

CSRF_ENABLED     = True

CSRF_SESSION_KEY = "secret"
SECRET_KEY = "secret"

我应该能够请求 /auth/query 并获取数据库表的内容,但我收到了错误 - “OperationalError:(sqlite3.OperationalError)没有这样的表:研究人员[SQL:u'INSERT INTO研究人员(前缀,后缀,电话,phone_ext,orcid)VALUES(?,?,?,?,?)'] [参数:( 'Dr.'、'Mr'、'08611111'、'+353'、'0001')](此错误的背景位于:http://sqlalche.me/e/e3q8 http://sqlalche.me/e/e3q8)"


当代码正在做的时候db.create_all(),模型尚未导入。导入它们会产生副作用,即填充 SQLAlchemy 在幕后使用的一些数据结构。如果db.create_all()在 SQLAlchemy 了解模型之前发生,它认为没有什么可做的。

试试这个:在__init__.py, 消除with app.appcontext(): db.create_all()并添加import models至底部。然后添加管理命令run.py。它看起来像

app = create_app()

@app.cli.command()
def createdb():
    db.create_all()

Then

FLASK_APP=run.py flask createdb

将创建表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Flask-SQLAlchemy 与应用程序工厂模式一起使用 的相关文章

随机推荐

  • 是否有任何带有角度材料过滤器功能的下拉菜单?注意:使用 mat-select 而不是 mat-option

    我在角度材料中搜索了过滤下拉选项 但找不到任何带有垫选择多重选择的内容 我认为角度材料中没有可用于垫选择的实现 有没有办法使用角度材料来实现这一点 好吧 我们可以创建一个带有过滤器的多选材质输入表单控件 由于答案有点大 您可以在以下位置看到
  • 如何用该语言编写该语言的编译器? [复制]

    这个问题在这里已经有答案了 可能的重复 一种语言的编译器如何用该语言编写 https stackoverflow com questions 2998768 how can a languages compiler be written i
  • 合并不会保留对文件的更改,为什么?

    我遇到过一个案例merge默默地忽略合并分支的一些更改 这是我所期望的 rebase会带走他们 案例如下 merge slave into master line not back oops was bad put the line bac
  • 使用 html 编码或混合应用程序的通用插件在四种环境(android、ios、blackberry 和 windows)中加载的启动屏幕[重复]

    这个问题在这里已经有答案了 我想要一个带有加载指示器或忙碌指示器或进度条的启动屏幕 在所有主要环境 android ios 黑莓和 Windows 中使用 html css 和 javascript 或通用插件 可以将其添加到我的 Web
  • Bulma:如何定义移动设备上的堆栈顺序

    我正在采取Bulma Flexbox CSS 框架 http bulma io 试一试 到目前为止它非常整洁 我发现的唯一障碍是我似乎无法设置移动设备的显示顺序 div class columns div class column foo
  • iPhone SDK / Facebook Connect:使用自定义登录对话框

    正如标题所说 是否可以在本机 iPhone 应用程序中使用 Facebook Connect 或任何其他 FB 集成方式 而无需借助内置登录对话框 这看起来很糟糕 我可以创建自己的自定义登录屏幕 要求输入 facebook 登录用户名和密码
  • 令人困惑的 python 列表理解

    我试图弄清楚这个列表理解是如何工作的 但我不太明白它是如何工作的 如果有人可以写出非列表理解的等价物 我想我可以理解 这是我坚持的路线 item for sublist in li for item in sublist 它的既定目的是扁平
  • RecyclerView onMeasure性能问题

    我在 recyclerView 中使用相当复杂的 recyclerView 项目布局 我已经开始遇到性能问题有一段时间了 每次运行应用程序时 我都会在 recyclerView 中的视图布局膨胀时收到警告 例如 D View ANR War
  • 偶数总和错误

    我收到以下错误 1 expected before line 2 2 expected at end of input line 12 这是我的代码 include
  • Ruby 修改一段字符串

    对于 Ruby 来说是全新的 这是一个简单的家庭作业 Secret code 函数需要接收输入字符串并执行以下操作 在空格之前的第一个字母块中 除第一个字符外的所有字母都大写 反转字符串 因此 如果输入是 super duper 则输出应该
  • 想要创建一个很酷的静态 UI,但是:“静态表视图仅有效......”

    我正在创建一个类似的视图 为此 我尝试使用 Storyboard 其中添加 2 个 TableView 均作为 静态单元格 然后直接从 Storyboard 手动添加单元格内容 在我的故事板中 它看起来很棒 但是当我构建时 我得到 en l
  • cv2可以直接加载上传的图片吗?

    我内存中有一个上传的文件 我想用 cv2 操作该文件 目前 我将文件写入磁盘 然后使用 cv2 读取它 如何跳过写入文件并直接使用 cv2 加载它 file request files file if file and allowed fi
  • 如何通过celery任务访问orm?

    我正在尝试使用 sqlalchemy celerybeats 翻转数据库中特定类型对象的布尔标志 但是如何从tasks py 文件访问我的orm from models import Book from celery decorators
  • JavaScript:将节点复制到 DocumentFragment

    我认为 DocumentFragment 的全部要点是能够在不接触 DOM 的情况下构造内容 直到它准备好为止 鉴于 DocumentFragment 不支持innerHTML 这可能有点乏味 另一方面 一旦构建完成 就可以很容易地通过片段
  • Ionic - 在 IOS 上,Stripe 支付按钮被键盘隐藏

    我的应用程序与 Stripe 集成用于支付目的 但我在 IOS 上遇到问题 人们无法支付 支付按钮悬停在键盘上方 没有像 Android 上那样的关闭按钮 我也无法成功地使弹出窗口滚动 我在用着定制集成 https stripe com d
  • 使用 pm2 以 root 身份启动应用程序

    我有一个守护进程 必须在启动时以 root 身份运行 我使用 pm2 启动其他应用程序 但无法确定它是否可以以 root 身份启动应用程序 能做到吗 如果没有 我有什么选择 我遇到了问题sudo pm2 start api 但这是因为 pm
  • 使用 docker for mac 在 docker 容器中公开 TTY 设备

    我正在尝试将插入我的 mac 的 Arduino 暴露给我正在运行的 Linux 实例适用于 Mac 的 Docker https docker github io docker for mac 没有虚拟机 Arduino 将自己暴露为 d
  • 为什么 SendKey Enter 无法在 Chrome 浏览器中使用

    我正在尝试检查在 Chrome 浏览器中输入 Excel 的几个 vin 此代码将打开浏览器并输入它们 但不会按 Enter 键来单击按钮 不知道我做错了什么 但我尝试了几种变体 但似乎想不出任何办法 抱歉 如果我的格式很糟糕 这是我第一次
  • Python 中的 {:02d} 是什么意思

    很难找到有关的信息 在线的 我看到下面的一些代码 def dateformat date day month year date split return 4d 02d 02d format int year int month int d
  • 如何让 Flask-SQLAlchemy 与应用程序工厂模式一起使用

    我想使用 Flask SQLAlchemy 设置一个 sqlite 数据库 我收到操作错误 sqlite3 OperationalError no such table 这是一个用 Flask 编写的 Web 应用程序 我想使用 Flask