我已获得数据库(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并使用其他东西?
我认为这里有一些答案可以处理您的情况,特别是 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)
我没有使用 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()
设法通过以下代码来做到这一点:
query = text('select * from "view_name"')
result = connection.execute(query)
inserted_rows = result.mappings().all()
这里需要记住的3点: