Как использовать тип Postgre HSTORE в приложении Flask? - PullRequest
2 голосов
/ 06 ноября 2019

Я новичок во 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 Ответ

2 голосов
/ 07 ноября 2019

В 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 должны храниться внутри столбцов, используя MutableDict во Flask (sqlalchemy)

Поэтому ваш код необходимо изменить как

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

Надеюсь, это решит вашу проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...