【问题标题】:How use Postgre's HSTORE type in Flask application?如何在 Flask 应用程序中使用 Postgre 的 HSTORE 类型?
【发布时间】:2019-11-06 13:39:39
【问题描述】:

我是 Flask 的初学者,我试图在我的模型中将我的表列之一作为 HSTORE。但是我遇到了一个错误。

谁能指出我如何在烧瓶应用程序中使用 HSTORE 类型。

我检查了太多链接,但找不到任何对我有用的东西。

在 SQLAlchemy 手册中,他们记录了 PostgreSQL HSTORE 类型以及 hstore 文字是受支持的。

https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#hstore-type

在我的模型中,我添加了以下代码。

from sqlalchemy.dialects import postgresql

#.........
class Submission(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    form_id = db.Column(db.Integer, db.ForeignKey('form.id'))
    origin = db.Column(db.String())
    form_data = db.Column(db.Hstore()) # I have also tried HSTORE(), hstore() 
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)

但是当我尝试运行我的烧瓶应用程序时,出现以下错误。

AttributeError: 'SQLAlchemy' object has no attribute 'Hstore'

我正在使用最新版本的 Flask - 1.1.1。

【问题讨论】:

    标签: python postgresql flask flask-sqlalchemy


    【解决方案1】:

    在 SQLAlchemy 中支持 HSTORE 类型以及 hstore 文字,但是您必须使用手动导入 hstore 扩展

    from sqlalchemy.dialects.postgresql import HSTORE
    from sqlalchemy.ext.mutable import MutableDict
    

    之后你应该用 hstore 描述列名和列类型

    form_data = db.Column(MutableDict.as_mutable(HSTORE))
    

    Python 字典应该存储在 Flask (sqlalchemy) 中使用 MutableDict 的列中

    所以你的代码需要改成

    from sqlalchemy.dialects import postgresql
    from sqlalchemy.dialects.postgresql import HSTORE
    from sqlalchemy.ext.mutable import MutableDict
    
    #.........
    class Submission(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     form_id = db.Column(db.Integer, db.ForeignKey('form.id'))
     origin = db.Column(db.String())
     form_data = db.Column(MutableDict.as_mutable(HSTORE))
     timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    

    还记得为您的数据库创建Hstore 扩展,如下所示

    从命令提示符登录 psql postgres

    sudo -u postgres psql
    

    假设您已经在 postgres 角色下创建了所需的数据库, 假设db_test 是数据库

    连接到db_test

    postgres=# \c db_test
    

    现在您应该连接到db_test 创建 hstore 扩展

    db_test=# CREATE EXTENSION hstore;
    

    hstore 扩展应该已成功创建, 列出在您的数据库上安装的扩展使用

    db_test=# \dx
    

    希望这能解决您的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 2018-07-20
      • 2017-05-27
      • 2014-05-06
      • 2019-07-26
      • 2021-04-29
      • 1970-01-01
      • 2014-04-04
      相关资源
      最近更新 更多