Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Knex create POINT data type in Postgres

I'm trying to create a schema with a POINT datatype & knex just doesn't seem to be creating it in the DB. However it's creating all the other fields.

Here is what my migration file looks like:

exports.up = (knex, Promise) => {
  return Promise.all([
    knex.schema.createTableIfNotExists('users', (table) => {
      table.uuid('id').primary()
      table.string('username', 35)
      table.text('pword').notNullable()
      table.string('first_name', 55)
      table.string('last_name', 55)
      knex.schema.raw('coordinates POINT DEFAULT POINT (37.3875, -122.0575)')
      table.timestamp('date_created').defaultTo(knex.fn.now())
    })
  ])
}

exports.down = (knex, Promise) => {
  return Promise.all([
    knex.schema.dropTableIfExists('users')
  ])
}

Here is the line of code which is failing:

knex.schema.raw('coordinates POINT DEFAULT POINT (37.3875, -122.0575)')

I've also tried removing the schema attribute:

knex.raw('coordinates POINT DEFAULT POINT (37.3875, -122.0575)')

There are no errors printed out, it just seems to fail silently.

Edit 1:

I printed this out using: knex.schema.raw('coordinates POINT DEFAULT POINT (37.3875, -122.0575)').then(data => console.log(data)).catch(error => console.log(error))

{ error: coordinates POINT DEFAULT POINT (37.3875, -122.0575) - syntax error at or near "coordinates"
    at Connection.parseE (/Users/james/plural/backend-development/node_modules/pg/lib/connection.js:554:11)
    at Connection.parseMessage (/Users/james/plural/backend-development/node_modules/pg/lib/connection.js:381:17)
    at Socket.<anonymous> (/Users/james/plural/backend-development/node_modules/pg/lib/connection.js:117:22)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
    at readableAddChunk (_stream_readable.js:172:18)
    at Socket.Readable.push (_stream_readable.js:130:10)
    at TCP.onread (net.js:542:20)
  name: 'error',
  length: 92,
  severity: 'ERROR',
  code: '42601',
  detail: undefined,
  hint: undefined,
  position: '1',
  internalPosition: undefined,
  internalQuery: undefined,
  where: undefined,
  schema: undefined,
  table: undefined,
  column: undefined,
  dataType: undefined,
  constraint: undefined,
  file: 'scan.l',
  line: '1081',
  routine: 'scanner_yyerror' }
like image 701
James111 Avatar asked Jan 08 '17 23:01

James111


1 Answers

Try this instead:

table.specificType('coordinates', 'POINT').defaultTo(knex.raw('POINT (37.3875, -122.0575)'))

For the SQL types not covered by Knex, you can always use the following format:

table.specificType('column_name', 'TYPE')

like image 187
QuantumLogic Avatar answered Nov 08 '22 15:11

QuantumLogic