如何从flask-SQLAlchemy查询SQL视图

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

我已获得数据库(MySQL,如果重要的话)的访问权限来访问我需要的一些数据,但我无法直接访问表,数据是通过 SQL 视图公开的。

我想使用 Flask 将其包装在一个小型 API 中。对于数据库连接,我打算使用 SQLAlchemy(只是因为它是我在 python 中知道的唯一数据库包装器)。

问题是,我已经阅读了大量文档,以及互联网上的数十篇 stackoverflow 帖子和指南,但我似乎找不到从 Flask-SQLAlchemy 查询 SQL 视图的方法。

在文档中,他们总是使用模型。我尝试将视图定义为模型,但我得到了

could not assemble any primary key columns for mapped table 'MySQLView'

我尝试做的事情:

class MyView(db.Model):
    __tablename__ = "my_view_name_in_sql"
    db.Column("id", db.Integer, primary_key=True)
    db.Column("sample_id", db.String)
    {...etc}

有没有办法做到这一点,或者也许我应该选择不使用flask-SQLAlchemy并使用其他东西?

python mysql sqlalchemy
3个回答
1
投票

我认为这里有一些答案可以处理您的情况,特别是 LeoRochael 的答案,他建议使用 https://pypi.org/project/sqlalchemy-views/ 包。 我建议检查您是否可以或无法访问数据库的元数据,我认为这确实可以帮助您避免手动制作模型

db_engine = sqlalchemy_package.create_engine("mysql+...")
db_metadata = db.MetaData(bind=db_engine)

然后,您可以尝试直接制作表格,或使用元数据制作视图,如我链接的答案中所示。

your_table = db.Table("my_view_name_in_sql", db_metadata, autoload=True)
view_definition = your_table.select()
your_view = CreateView(your_table, view_definition, or_replace=True)

1
投票

我没有使用 SQLAlchemy Flask 的经验,但这对我来说在 SQLAlchemy 中很有用。我使用

__mapper_args__
属性来定义数据库中视图的私钥。

db_metadata = MetaData()
Base = automap_base(metadata=db_metadata)

class MyView(Base):
    __table__ = Table("View_Name", db_metadata, autoload_with=engine, schema="My_Schema")
    __mapper_args__ = {'primary_key': [__table__.c['Primary_Column_Name']]}

Base.prepare()

0
投票

设法通过以下代码来做到这一点:

query = text('select * from "view_name"')
result = connection.execute(query)
inserted_rows = result.mappings().all()

这里需要记住的3点:

  1. 用sqlalchemy的text方法包裹查询语句
  2. view_name”应该用双引号括起来
  3. 查询结果是 CursorResult 类型,并包含用于检索数据的映射方法
© www.soinside.com 2019 - 2024. All rights reserved.