dresende / node-orm2

Object Relational Mapping
http://github.com/dresende/node-orm2
MIT License
3.07k stars 379 forks source link

Postgres JSON type doesn't like buffer values #600

Open twolfson opened 9 years ago

twolfson commented 9 years ago

I am trying to get orm setup on an existing database that leverages JSON columns. It looks like the object type is saving to hexadecimal values. However, Postgres 9.3 doesn't like this. Can we remove this buffer escaping (prob not since we have #378) or add a new type called json which doesn't encode into hex (a la #381)?

$ createdb buffer-test
$ psql buffer-test 
psql (9.3.5)
Type "help" for help.

buffer-test=# CREATE TABLE items (item json);
CREATE TABLE
buffer-test=# INSERT INTO items (item) VALUES ('{}');
INSERT 0 1
buffer-test=# INSERT INTO items (item) VALUES ('\x7b7d');
ERROR:  invalid input syntax for type json
LINE 1: INSERT INTO items (item) VALUES ('\x7b7d');
                                         ^
DETAIL:  Token "\" is invalid.
CONTEXT:  JSON data, line 1: \...
twolfson commented 9 years ago

I have added the datatype via defineType and it looks like it's working great:

// Add in the JSON data type (`object` works with binary/string columns)
// https://github.com/dresende/node-orm2/wiki/Model-Properties#custom-types
db.defineType('json', {
  datastoreType: function (prop) {
    return 'JSON';
  },

  // https://github.com/dresende/node-orm2/blob/v2.1.20/lib/Drivers/DML/postgres.js#L247-L256
  valueToProperty: function (value, prop) {
    if (typeof value !== 'object') {
      try {
        value = JSON.parse(value);
      } catch (err) {
        value = null;
      }
    }
    return value;
  },

  // https://github.com/dresende/node-orm2/blob/v2.1.20/lib/Drivers/DML/postgres.js#L317-L321
  propertyToValue: function (value, prop) {
    if (value !== null) {
      value = JSON.stringify(value);
    }
    return value;
  }
});