diff --git a/helpers/query-types.js b/helpers/query-types.js index 66d42b3..2091038 100644 --- a/helpers/query-types.js +++ b/helpers/query-types.js @@ -30,7 +30,7 @@ queryTypes.add( queryTypes.add( 'create-table' -, '{with} create table {ifNotExists} {table} ({definition})' +, '{with} create table {ifNotExists} {table} ({definition}{constraints})' ); queryTypes.add( diff --git a/helpers/query/constraints.js b/helpers/query/constraints.js new file mode 100644 index 0000000..bdf33fe --- /dev/null +++ b/helpers/query/constraints.js @@ -0,0 +1,26 @@ +var helpers = require('../../lib/query-helpers'); +var utils = require('../../lib/utils'); + +var quoteList = function(vals){ + return vals.map(function(val){ + return utils.quoteObject(val) + }).join(', '); +}; + +helpers.register('constraints', function(constraints, values, query){ + var output = []; + + for (var k in constraints) { + switch(k) { + case 'primaryKey': + output.push('primary key (' + quoteList(constraints[k]) +')'); + break; + case 'unique': + output.push('unique (' + quoteList(constraints[k]) + ')'); + break; + } + } + + if (!output.length) return ''; + return ', ' + output.join(', '); +}); diff --git a/index.js b/index.js index 1f20a4b..01eba8f 100644 --- a/index.js +++ b/index.js @@ -23,6 +23,7 @@ require('./helpers/query/cascade'); require('./helpers/query/column-constraint'); require('./helpers/query/columns'); require('./helpers/query/conflict'); +require('./helpers/query/constraints'); require('./helpers/query/definition'); require('./helpers/query/distinct'); require('./helpers/query/expression'); diff --git a/test/create-table.js b/test/create-table.js index 290377a..856fe10 100644 --- a/test/create-table.js +++ b/test/create-table.js @@ -258,7 +258,6 @@ describe('Built-In Query Types', function(){ } } }); - assert.equal( query.toString() , [ 'create table "posts" (' @@ -270,5 +269,30 @@ describe('Built-In Query Types', function(){ ); }); + it('Should support table constraints', function(){ + var query = builder.sql({ + type: 'create-table' + , table: 'foo' + , definition: { + name: { type: 'text' } + , email: { type: 'text' } + } + + , constraints: { + primaryKey: ['name', 'email'] + , unique: ['email', 'name'] + } + }); + assert.equal( + query.toString() + , [ 'create table "foo" (' + , '"name" text, "email" text, ' + , 'primary key ("name", "email"), ' + , 'unique ("email", "name")' + , ')' + ].join('') + ); + }); + }); });