我是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。
答案 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
希望这可以解决您的问题