Resolvendo Erros no Pytest com Hstore

O Problema

Em um dos projetos Django que trabalho, precisei utilizar um campo do tipo JSONField.

Aqui está um exemplo de uso:

from django.contrib.postgres.fields import JSONField
from django.db import models

class MyModel(models.Model):
    my_field = JSONField(blank=True, null=True)
    [...]    

O problema foi que isto trouxe erros ao rodar o pytest com a a flag --no-migrations.

Exemplo:

$ pytest --no-migrations

[...]
    def _execute(self, sql, params, *ignored_wrapper_args):
        self.db.validate_no_broken_transaction()
        with self.db.wrap_database_errors:
            if params is None:
>               return self.cursor.execute(sql)
E               psycopg2.errors.UndefinedObject: type "hstore" does not exist
E               LINE 1: ...NULL, "product_id" integer NOT NULL, "attributes" hstore NOT...
E       

A Solução

Pesquisando sobre o erro na internet, vi que esse era um problema do Postgres. Temos que instalar, manualmente, a extensão hstore.

O passo a passo é esse:

  • $ sudo -iu postgres
  • psql
  • CREATE EXTENSION hstore;
  • \q
  • $ psql -d template1 -c 'create extension hstore;'

Prontinho. Podemos utilizar o --no-migrations 😉

Referências