Flask-SQLAlchemy:'Table' 对象没有属性 'query_by'

Flask-SQLAlchemy: 'Table' object has no attribute 'query_by'

我正在使用 Flask 开发一个 API,但我无法从我连接到 flask-sqlalchemy 的 MySQL 数据库中检索查询(不仅仅是 sqlalchemy)。这是从我的客户的 PHPMyAdmin 下载的预先存在的数据库,所以我没有 运行 db.create_all():我只是在 config.py 中创建了连接字符串,然后实例化 db = SQLAchemy() 和在我的工厂函数中初始化它 (db.init_app(app))(我将工厂模式与蓝图一起使用)。

我已经检查过,我的计算机正在 运行 执行 mysql 进程,提供的登录凭据是正确的,数据库存在于我的计算机中。我正在使用 MariaDB,因为我 运行 Manjaro Linux.

这是连接字符串,位于config.py:

SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or "mariadb+mariadbconnector://dev:dev@localhost/desayunos56"

这是相关模型。它是使用 flask-sqlacodegen 创建的,然后由我修改为仅使用 table 中的相关列。在 models.py:

from flask_sqlalchemy import SQLAlchemy
from app import db
# coding: utf-8

t_aus_postmeta = db.Table(
    """ 
        post_id: Order ID
        meta_key: Type of value (client name, billing address)
        meta_value: Value of meta_key (Name or address itself)
     """
    'aus_postmeta',
    #db.Column('meta_id', db.BigInteger, nullable=False),
    db.Column('post_id', db.BigInteger, nullable=False, server_default=db.FetchedValue()),
    db.Column('meta_key', db.String(255, 'utf8mb4_unicode_ci')),
    db.Column('meta_value', db.String(collation='utf8mb4_unicode_ci'))
)

最后,这是有错误的文件,views.py。这是已经注册到 __init__.py 的蓝图。我创建它只是为了检查我是否可以 运行 查询,但我真的不打算从 Flask 渲染任何东西:

from flask import render_template
from . import main
from .. import db
from app.models import t_aus_postmeta


@main.route("/", methods=["GET"])
def index():
    result = t_aus_postmeta.query_by(post_id=786).first()

这是我得到的错误:AttributeError: 'Table' object has no attribute 'query_by'

我认为值得注意的是,虽然我的 linter 没有因为未解决的导入而抱怨,但当我使用 t_aus_postmeta 时,我没有得到任何方法建议。

我检查过的所有问题都是基于使用 sqlalchemy 而不是 flask-sqlalchemy。是什么导致了这个错误?至此,我不知所措。

我认为这不是创建模型的正确方法。相反,您应该将其创建为 class,它将继承自 db.Model,其中包含您的 query_by 方法。

models.py

class t_aus_postmeta(db.Model):
    """
        post_id: Order ID
        meta_key: Type of value (client name, billing address)
        meta_value: Value of meta_key (Name or address itself)
     """
    __tablename__ = 'aus_postmeta'
    post_id = db.Column(db.BigInteger(), nullable=False, server_default=db.FetchedValue())

    # rest of your columns...

如果您这样做,有效查询将如下所示:

t_aus_postmeta.query.filter_by('post_id').first()

请注意,这包括 tutiplain 的 建议。我认为您的方法名称错误。只是 query 后跟 filter_by!

我找不到您正在使用的“query_by”方法的 API 参考。好像没有这种方法。也许您的意思是“filter_by”?