在Flask应用程序中如何使用Postgre的HSTORE类型?

时间:2019-11-06 13:39:39

标签: python postgresql flask flask-sqlalchemy

我是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。

1 个答案:

答案 0 :(得分:2)

在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

希望这可以解决您的问题