mirror of
https://github.com/knex/knex.git
synced 2025-08-04 23:02:05 +00:00
4161 lines
165 KiB
HTML
4161 lines
165 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html>
|
|
<head>
|
|
<title>knex.js</title>
|
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
|
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
|
<link rel="stylesheet" media="all" href="docco.css" />
|
|
</head>
|
|
<body>
|
|
<div id="container">
|
|
<div id="background"></div>
|
|
|
|
<ul class="sections">
|
|
|
|
<li id="title">
|
|
<div class="annotation">
|
|
<h1>knex.js</h1>
|
|
</div>
|
|
</li>
|
|
|
|
|
|
|
|
<li id="section-1">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-1">¶</a>
|
|
</div>
|
|
<pre><code>Knex.js 0.1.4
|
|
|
|
(c) 2013 Tim Griesser
|
|
Knex may be freely distributed under the MIT license.
|
|
For details and documentation:
|
|
http://knexjs.org</code></pre>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre>(<span class="keyword">function</span>() {
|
|
|
|
<span class="string">"use strict"</span>;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-2">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-2">¶</a>
|
|
</div>
|
|
<p>Required dependencies.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> _ = require(<span class="string">'underscore'</span>);
|
|
<span class="keyword">var</span> When = require(<span class="string">'when'</span>);
|
|
|
|
<span class="keyword">var</span> push = Array.prototype.push;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-3">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-3">¶</a>
|
|
</div>
|
|
<p><code>Knex</code> is the root namespace and a chainable function: <code>Knex('tableName')</code></p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Knex = <span class="keyword">function</span>(table) {
|
|
<span class="keyword">if</span> (!Knex.Instances[<span class="string">'main'</span>]) {
|
|
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The Knex instance has not been initialized yet.'</span>);
|
|
}
|
|
<span class="keyword">return</span> Knex.Instances[<span class="string">'main'</span>](table);
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-4">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-4">¶</a>
|
|
</div>
|
|
<p>Keep in sync with package.json</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Knex.VERSION = <span class="string">'0.1.4'</span>;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-5">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-5">¶</a>
|
|
</div>
|
|
<p>Methods common to both the <code>Grammar</code> and <code>SchemaGrammar</code> interfaces,
|
|
used to generate the sql in one form or another.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Common = {
|
|
|
|
_debug: <span class="literal">false</span>,
|
|
|
|
_promise: <span class="literal">null</span>,
|
|
|
|
debug: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>._debug = <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-6">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-6">¶</a>
|
|
</div>
|
|
<p>For those who dislike promise interfaces.
|
|
Multiple calls to <code>exec</code> will resolve with the same value
|
|
if called more than once.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> exec: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">this</span>._promise || (<span class="keyword">this</span>._promise = <span class="keyword">this</span>.runQuery());
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._promise.then(<span class="keyword">function</span>(resp) {
|
|
callback(<span class="literal">null</span>, resp);
|
|
}, <span class="keyword">function</span>(err) {
|
|
callback(err, <span class="literal">null</span>);
|
|
});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-7">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-7">¶</a>
|
|
</div>
|
|
<p>The promise interface for the query builder.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> then: <span class="keyword">function</span>(onFulfilled, onRejected) {
|
|
<span class="keyword">this</span>._promise || (<span class="keyword">this</span>._promise = <span class="keyword">this</span>.runQuery());
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._promise.then(onFulfilled, onRejected);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-8">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-8">¶</a>
|
|
</div>
|
|
<p>Returns an array of query strings filled out with the
|
|
correct values based on bindings, etc. Useful for debugging.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> toString: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.type || (<span class="keyword">this</span>.type = <span class="string">'select'</span>);
|
|
<span class="keyword">var</span> data = <span class="keyword">this</span>.toSql();
|
|
<span class="keyword">var</span> builder = <span class="keyword">this</span>;
|
|
<span class="keyword">if</span> (!_.isArray(data)) data = [data];
|
|
<span class="keyword">return</span> _.map(data, <span class="keyword">function</span>(str) {
|
|
<span class="keyword">var</span> questionCount = <span class="number">0</span>;
|
|
<span class="keyword">return</span> str.replace(<span class="regexp">/\?/g</span>, <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> builder.bindings[questionCount++];
|
|
});
|
|
}).join(<span class="string">'; '</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-9">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-9">¶</a>
|
|
</div>
|
|
<p>Explicitly sets the connection.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> connection: <span class="keyword">function</span>(connection) {
|
|
<span class="keyword">this</span>._connection = connection;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-10">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-10">¶</a>
|
|
</div>
|
|
<p>The connection the current query is being run on, optionally
|
|
specified by the <code>connection</code> method.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _connection: <span class="literal">false</span>,</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-11">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-11">¶</a>
|
|
</div>
|
|
<p>Sets the "type" of the current query, so we can potentially place
|
|
<code>select</code>, <code>update</code>, <code>del</code>, etc. anywhere in the query statement
|
|
and have it come out fine.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _setType: <span class="keyword">function</span>(type) {
|
|
<span class="keyword">if</span> (<span class="keyword">this</span>.type) {
|
|
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The query type has already been set to '</span> + <span class="keyword">this</span>.type);
|
|
}
|
|
<span class="keyword">this</span>.type = type;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-12">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-12">¶</a>
|
|
</div>
|
|
<p>Returns all bindings excluding the <code>Knex.Raw</code> types.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _cleanBindings: <span class="keyword">function</span>() {
|
|
<span class="keyword">var</span> bindings = <span class="keyword">this</span>.bindings;
|
|
<span class="keyword">var</span> cleaned = [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = bindings.length; i < l; i++) {
|
|
<span class="keyword">if</span> (!(bindings[i] <span class="keyword">instanceof</span> Raw)) cleaned.push(bindings[i]);
|
|
}
|
|
<span class="keyword">return</span> cleaned;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-13">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-13">¶</a>
|
|
</div>
|
|
<p>Runs the query on the current builder instance and returns a promise.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> runQuery: <span class="keyword">function</span>() {
|
|
<span class="keyword">if</span> (<span class="keyword">this</span>.transaction) {
|
|
<span class="keyword">if</span> (!<span class="keyword">this</span>.transaction.connection) <span class="keyword">return</span> When.reject(<span class="keyword">new</span> Error(<span class="string">'The transaction has already completed.'</span>));
|
|
<span class="keyword">this</span>._connection = <span class="keyword">this</span>.transaction.connection;
|
|
}</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-14">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-14">¶</a>
|
|
</div>
|
|
<p>Prep the SQL associated with the this.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">this</span>.sql = <span class="keyword">this</span>.toSql();
|
|
<span class="keyword">this</span>.bindings = <span class="keyword">this</span>._cleanBindings();
|
|
<span class="keyword">if</span> (!_.isArray(<span class="keyword">this</span>.sql)) <span class="keyword">this</span>.sql = [<span class="keyword">this</span>.sql];
|
|
|
|
<span class="keyword">var</span> chain;
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.sql.length; i < l; i++) {
|
|
<span class="keyword">if</span> (chain) {
|
|
chain.then(multiQuery(<span class="keyword">this</span>, i, chain));
|
|
} <span class="keyword">else</span> {
|
|
chain = multiQuery(<span class="keyword">this</span>, i);
|
|
}
|
|
}
|
|
<span class="keyword">return</span> chain;
|
|
}
|
|
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-15">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-15">¶</a>
|
|
</div>
|
|
<h2>Grammar</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-16">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-16">¶</a>
|
|
</div>
|
|
<p>The list of different components</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> components = [
|
|
<span class="string">'aggregate'</span>, <span class="string">'columns'</span>, <span class="string">'from'</span>,
|
|
<span class="string">'joins'</span>, <span class="string">'wheres'</span>, <span class="string">'groups'</span>, <span class="string">'havings'</span>,
|
|
<span class="string">'orders'</span>, <span class="string">'limit'</span>, <span class="string">'offset'</span>, <span class="string">'unions'</span>
|
|
];
|
|
|
|
Knex.Grammar = {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-17">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-17">¶</a>
|
|
</div>
|
|
<p>Compiles the <code>select</code> statement, or nested sub-selects
|
|
by calling each of the component compilers, trimming out
|
|
the empties, and returning a generated query string.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileSelect: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> sql = {};
|
|
<span class="keyword">if</span> (_.isEmpty(qb.columns)) qb.columns = [<span class="string">'*'</span>];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = components.length; i < l; i++) {
|
|
<span class="keyword">var</span> component = components[i];
|
|
<span class="keyword">var</span> result = _.result(qb, component);
|
|
<span class="keyword">if</span> (result != <span class="literal">null</span>) {
|
|
sql[component] = <span class="keyword">this</span>[<span class="string">'compile'</span> + capitalize(component)](qb, result);
|
|
}
|
|
}
|
|
<span class="keyword">return</span> _.compact(sql).join(<span class="string">' '</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-18">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-18">¶</a>
|
|
</div>
|
|
<p>Compiles an aggregate query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileAggregate: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> column = <span class="keyword">this</span>.columnize(qb.aggregate.columns);
|
|
<span class="keyword">if</span> (qb.isDistinct && column !== <span class="string">'*'</span>) {
|
|
column = <span class="string">'distinct '</span> + column;
|
|
}
|
|
<span class="keyword">return</span> <span class="string">'select '</span> + qb.aggregate.type + <span class="string">'('</span> + column + <span class="string">') as aggregate'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-19">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-19">¶</a>
|
|
</div>
|
|
<p>Compiles the columns in the query, specifying if an item was distinct.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileColumns: <span class="keyword">function</span>(qb, columns) {
|
|
<span class="keyword">if</span> (qb.aggregate != <span class="literal">null</span>) <span class="keyword">return</span>;
|
|
<span class="keyword">return</span> (qb.isDistinct ? <span class="string">'select distinct '</span> : <span class="string">'select '</span>) + <span class="keyword">this</span>.columnize(columns);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-20">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-20">¶</a>
|
|
</div>
|
|
<p>Compiles the <code>from</code> tableName portion of the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileFrom: <span class="keyword">function</span>(qb, table) {
|
|
<span class="keyword">return</span> <span class="string">'from '</span> + <span class="keyword">this</span>.wrapTable(table);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-21">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-21">¶</a>
|
|
</div>
|
|
<p>Compiles all each of the <code>join</code> clauses on the query,
|
|
including any nested join queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileJoins: <span class="keyword">function</span>(qb, joins) {
|
|
<span class="keyword">var</span> sql = [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = joins.length; i < l; i++) {
|
|
<span class="keyword">var</span> join = joins[i];
|
|
<span class="keyword">var</span> clauses = [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i2 = <span class="number">0</span>, l2 = join.clauses.length; i2 < l2; i2++) {
|
|
<span class="keyword">var</span> clause = join.clauses[i2];
|
|
clauses.push(
|
|
[clause[<span class="string">'bool'</span>], <span class="keyword">this</span>.wrap(clause[<span class="string">'first'</span>]), clause.operator, <span class="keyword">this</span>.wrap(clause[<span class="string">'second'</span>])].join(<span class="string">' '</span>)
|
|
);
|
|
}
|
|
clauses[<span class="number">0</span>] = clauses[<span class="number">0</span>].replace(<span class="regexp">/and |or /</span>, <span class="string">''</span>);
|
|
sql.push(join.type + <span class="string">' join '</span> + <span class="keyword">this</span>.wrapTable(join.table) + <span class="string">' on '</span> + clauses.join(<span class="string">' '</span>));
|
|
}
|
|
<span class="keyword">return</span> sql.join(<span class="string">' '</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-22">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-22">¶</a>
|
|
</div>
|
|
<p>Compiles all <code>where</code> statements on the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileWheres: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> sql = [];
|
|
<span class="keyword">var</span> wheres = qb.wheres;
|
|
<span class="keyword">if</span> (wheres.length === <span class="number">0</span>) <span class="keyword">return</span> <span class="string">''</span>;
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = wheres.length; i < l; i++) {
|
|
<span class="keyword">var</span> where = wheres[i];
|
|
sql.push(where.bool + <span class="string">' '</span> + <span class="keyword">this</span>[<span class="string">'where'</span> + where.type](qb, where));
|
|
}
|
|
<span class="keyword">return</span> (sql.length > <span class="number">0</span> ? <span class="string">'where '</span> + sql.join(<span class="string">' '</span>).replace(<span class="regexp">/and |or /</span>, <span class="string">''</span>) : <span class="string">''</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-23">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-23">¶</a>
|
|
</div>
|
|
<p>Compile the "union" queries attached to the main query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileUnions: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> sql = <span class="string">''</span>;
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = qb.unions.length; i < l; i++) {
|
|
<span class="keyword">var</span> union = qb.unions[i];
|
|
sql += (union.all ? <span class="string">'union all '</span> : <span class="string">'union '</span>) + <span class="keyword">this</span>.compileSelect(union.query);
|
|
}
|
|
<span class="keyword">return</span> sql;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-24">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-24">¶</a>
|
|
</div>
|
|
<p>Compiles a nested where clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNested: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="string">'('</span> + <span class="keyword">this</span>.compileWheres(where.query).slice(<span class="number">6</span>) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-25">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-25">¶</a>
|
|
</div>
|
|
<p>Compiles a nested where clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereSub: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' '</span> + where.operator + <span class="string">' ('</span> + (<span class="keyword">this</span>.compileSelect(where.query)) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-26">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-26">¶</a>
|
|
</div>
|
|
<p>Compiles a basic where clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereBasic: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' '</span> + where.operator + <span class="string">' '</span> + <span class="keyword">this</span>.parameter(where.value);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-27">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-27">¶</a>
|
|
</div>
|
|
<p>Compiles a basic exists clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereExists: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="string">'exists ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-28">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-28">¶</a>
|
|
</div>
|
|
<p>Compiles a basic not exists clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNotExists: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="string">'not exists ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-29">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-29">¶</a>
|
|
</div>
|
|
<p>Compiles a where in clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereIn: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' in ('</span> + <span class="keyword">this</span>.parameterize(where.value) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-30">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-30">¶</a>
|
|
</div>
|
|
<p>Compiles a where not in clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNotIn: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' not in ('</span> + <span class="keyword">this</span>.parameterize(where.value) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-31">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-31">¶</a>
|
|
</div>
|
|
<p>Compiles a sub-where in clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereInSub: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' in ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-32">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-32">¶</a>
|
|
</div>
|
|
<p>Compiles a sub-where not in clause.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNotInSub: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' not in ('</span> + <span class="keyword">this</span>.compileSelect(where.query) + <span class="string">')'</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-33">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-33">¶</a>
|
|
</div>
|
|
<p>Where between.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereBetween: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' between ? and ?'</span>;
|
|
},
|
|
|
|
whereNull: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' is null'</span>;
|
|
},
|
|
|
|
whereNotNull: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(where.column) + <span class="string">' is not null'</span>;
|
|
},
|
|
|
|
whereRaw: <span class="keyword">function</span>(qb, where) {
|
|
<span class="keyword">return</span> where.sql;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-34">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-34">¶</a>
|
|
</div>
|
|
<p>Compiles the <code>group by</code> columns.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileGroups: <span class="keyword">function</span>(qb, groups) {
|
|
<span class="keyword">return</span> <span class="string">'group by '</span> + <span class="keyword">this</span>.columnize(groups);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-35">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-35">¶</a>
|
|
</div>
|
|
<p>Compiles the <code>having</code> statements.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileHavings: <span class="keyword">function</span>(qb, havings) {
|
|
<span class="keyword">return</span> <span class="string">'having '</span> + havings.map(<span class="keyword">function</span>(having) {
|
|
<span class="keyword">if</span> (having.type === <span class="string">'raw'</span>) {
|
|
<span class="keyword">return</span> having.bool + <span class="string">' '</span> + having.sql;
|
|
}
|
|
<span class="keyword">return</span> <span class="string">''</span> + <span class="keyword">this</span>.wrap(having.column) + <span class="string">' '</span> + having.operator + <span class="string">' '</span> + <span class="keyword">this</span>.parameter(having[<span class="string">'value'</span>]);
|
|
}, <span class="keyword">this</span>).join(<span class="string">'and '</span>).replace(<span class="regexp">/and /</span>, <span class="string">''</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-36">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-36">¶</a>
|
|
</div>
|
|
<p>Compiles the <code>order by</code> statements.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileOrders: <span class="keyword">function</span>(qb, orders) {
|
|
<span class="keyword">if</span> (orders.length > <span class="number">0</span>) {
|
|
<span class="keyword">return</span> <span class="string">'order by '</span> + orders.map(<span class="keyword">function</span>(order) {
|
|
<span class="keyword">return</span> <span class="string">''</span> + <span class="keyword">this</span>.wrap(order.column) + <span class="string">' '</span> + order.direction;
|
|
}, <span class="keyword">this</span>).join(<span class="string">', '</span>);
|
|
}
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-37">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-37">¶</a>
|
|
</div>
|
|
<p>Compiles the <code>limit</code> statements.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileLimit: <span class="keyword">function</span>(qb, limit) {
|
|
<span class="keyword">return</span> <span class="string">'limit '</span> + limit;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-38">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-38">¶</a>
|
|
</div>
|
|
<p>Compiles an <code>offset</code> statement on the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileOffset: <span class="keyword">function</span>(qb, offset) {
|
|
<span class="keyword">return</span> <span class="string">'offset '</span> + offset;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-39">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-39">¶</a>
|
|
</div>
|
|
<p>Compiles an <code>insert</code> query, allowing for multiple
|
|
inserts using a single query statement.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileInsert: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> values = qb.values;
|
|
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(qb.table);
|
|
<span class="keyword">var</span> columns = <span class="keyword">this</span>.columnize(_.keys(values[<span class="number">0</span>]).sort());
|
|
<span class="keyword">var</span> parameters = <span class="keyword">this</span>.parameterize(_.values(values[<span class="number">0</span>]));
|
|
<span class="keyword">var</span> paramBlocks = [];</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-40">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-40">¶</a>
|
|
</div>
|
|
<p>If there are any "where" clauses, we need to omit
|
|
any bindings that may have been associated with them.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (qb.wheres.length > <span class="number">0</span>) <span class="keyword">this</span>._clearWhereBindings(qb);
|
|
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = values.length; i < l; ++i) {
|
|
paramBlocks.push(<span class="string">"("</span> + parameters + <span class="string">")"</span>);
|
|
}
|
|
|
|
<span class="keyword">return</span> <span class="string">"insert into "</span> + table + <span class="string">" ("</span> + columns + <span class="string">") values "</span> + paramBlocks.join(<span class="string">', '</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-41">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-41">¶</a>
|
|
</div>
|
|
<p>Depending on the type of <code>where</code> clause, this will appropriately
|
|
remove any binding caused by "where" constraints, allowing the same
|
|
query to be used for <code>insert</code> and <code>update</code> without issue.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _clearWhereBindings: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> wheres = qb.wheres;
|
|
<span class="keyword">var</span> bindingCount = <span class="number">0</span>;
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = wheres.length; i<l; i++) {
|
|
<span class="keyword">var</span> where = wheres[i];
|
|
<span class="keyword">if</span> (_.isArray(where.value)) {
|
|
bindingCount += where.value.length;
|
|
} <span class="keyword">else</span> <span class="keyword">if</span> (where.query) {
|
|
bindingCount += where.query.bindings.length;
|
|
} <span class="keyword">else</span> {
|
|
bindingCount += <span class="number">1</span>;
|
|
}
|
|
}
|
|
qb.bindings = qb.bindings.slice(bindingCount);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-42">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-42">¶</a>
|
|
</div>
|
|
<p>Compiles an <code>update</code> query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileUpdate: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> values = qb.values;
|
|
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(qb.table), columns = [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i=<span class="number">0</span>, l = values.length; i < l; i++) {
|
|
<span class="keyword">var</span> value = values[i];
|
|
columns.push(<span class="keyword">this</span>.wrap(value[<span class="number">0</span>]) + <span class="string">' = '</span> + <span class="keyword">this</span>.parameter(value[<span class="number">1</span>]));
|
|
}
|
|
<span class="keyword">return</span> <span class="string">'update '</span> + table + <span class="string">' set '</span> + columns.join(<span class="string">', '</span>) + <span class="string">' '</span> + <span class="keyword">this</span>.compileWheres(qb);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-43">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-43">¶</a>
|
|
</div>
|
|
<p>Compiles a <code>delete</code> query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileDelete: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(qb.table);
|
|
<span class="keyword">var</span> where = !_.isEmpty(qb.wheres) ? <span class="keyword">this</span>.compileWheres(qb) : <span class="string">''</span>;
|
|
<span class="keyword">return</span> <span class="string">'delete from '</span> + table + <span class="string">' '</span> + where;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-44">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-44">¶</a>
|
|
</div>
|
|
<p>Compiles a <code>truncate</code> query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileTruncate: <span class="keyword">function</span>(qb) {
|
|
<span class="keyword">return</span> <span class="string">'truncate '</span> + <span class="keyword">this</span>.wrapTable(qb.table);
|
|
},
|
|
|
|
wrap: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">var</span> segments;
|
|
<span class="keyword">if</span> (value <span class="keyword">instanceof</span> Raw) <span class="keyword">return</span> value.value;
|
|
<span class="keyword">if</span> (_.isNumber(value)) <span class="keyword">return</span> value;
|
|
<span class="keyword">if</span> (value.toLowerCase().indexOf(<span class="string">' as '</span>) !== -<span class="number">1</span>) {
|
|
segments = value.split(<span class="string">' '</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(segments[<span class="number">0</span>]) + <span class="string">' as '</span> + <span class="keyword">this</span>.wrap(segments[<span class="number">2</span>]);
|
|
}
|
|
<span class="keyword">var</span> wrapped = [];
|
|
segments = value.split(<span class="string">'.'</span>);
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = segments.length; i < l; i = ++i) {
|
|
value = segments[i];
|
|
<span class="keyword">if</span> (i === <span class="number">0</span> && segments.length > <span class="number">1</span>) {
|
|
wrapped.push(<span class="keyword">this</span>.wrapTable(value));
|
|
} <span class="keyword">else</span> {
|
|
wrapped.push(<span class="keyword">this</span>.wrapValue(value));
|
|
}
|
|
}
|
|
<span class="keyword">return</span> wrapped.join(<span class="string">'.'</span>);
|
|
},
|
|
|
|
wrapArray: <span class="keyword">function</span>(values) {
|
|
<span class="keyword">return</span> _.map(values, <span class="keyword">this</span>.wrap, <span class="keyword">this</span>);
|
|
},
|
|
|
|
wrapTable: <span class="keyword">function</span>(table) {
|
|
<span class="keyword">if</span> (table <span class="keyword">instanceof</span> Raw) <span class="keyword">return</span> table.value;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.wrap(table);
|
|
},
|
|
|
|
columnize: <span class="keyword">function</span>(columns) {
|
|
<span class="keyword">return</span> _.map(columns, <span class="keyword">this</span>.wrap, <span class="keyword">this</span>).join(<span class="string">', '</span>);
|
|
},
|
|
|
|
parameterize: <span class="keyword">function</span>(values) {
|
|
<span class="keyword">return</span> _.map(values, <span class="keyword">this</span>.parameter, <span class="keyword">this</span>).join(<span class="string">', '</span>);
|
|
},
|
|
|
|
parameter: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">return</span> (value <span class="keyword">instanceof</span> Raw ? value.value : <span class="string">'?'</span>);
|
|
}
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-45">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-45">¶</a>
|
|
</div>
|
|
<h2>Knex.Builder</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-46">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-46">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Builder = Knex.Builder = <span class="keyword">function</span>(table) {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-47">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-47">¶</a>
|
|
</div>
|
|
<p>We use this logic to create sub-builders
|
|
for the advanced query statements.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (table) {
|
|
<span class="keyword">if</span> (_.isString(table)) {
|
|
<span class="keyword">this</span>.table = table;
|
|
} <span class="keyword">else</span> {
|
|
<span class="keyword">this</span>.client = table.client;
|
|
<span class="keyword">this</span>.grammar = table.grammar;
|
|
}
|
|
}
|
|
|
|
<span class="keyword">this</span>.reset();
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-48">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-48">¶</a>
|
|
</div>
|
|
<p>All operators used in the <code>where</code> clause generation.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> operators = [<span class="string">'='</span>, <span class="string">'<'</span>, <span class="string">'>'</span>, <span class="string">'<='</span>, <span class="string">'>='</span>, <span class="string">'<>'</span>, <span class="string">'like'</span>, <span class="string">'not like'</span>, <span class="string">'between'</span>, <span class="string">'ilike'</span>];
|
|
|
|
_.extend(Builder.prototype, Common, {
|
|
|
|
_source: <span class="string">'Builder'</span>,
|
|
|
|
_idAttribute: <span class="string">'id'</span>,</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-49">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-49">¶</a>
|
|
</div>
|
|
<p>Sets the <code>returning</code> for the query - only necessary
|
|
to set the "returning" value for the postgres insert,
|
|
defaults to <code>id</code>.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> idAttribute: <span class="keyword">function</span>(val) {
|
|
<span class="keyword">this</span>._idAttribute = val;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-50">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-50">¶</a>
|
|
</div>
|
|
<p>Sets the <code>tableName</code> on the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> from: <span class="keyword">function</span>(tableName) {
|
|
<span class="keyword">if</span> (!tableName) <span class="keyword">return</span> <span class="keyword">this</span>.table;
|
|
<span class="keyword">this</span>.table = tableName;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-51">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-51">¶</a>
|
|
</div>
|
|
<p>Adds a column to the list of "columns" being selected
|
|
on the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> column: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">this</span>.columns.push(value);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-52">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-52">¶</a>
|
|
</div>
|
|
<p>Adds a <code>distinct</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> distinct: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">this</span>.column(column);
|
|
<span class="keyword">this</span>.isDistinct = <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-53">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-53">¶</a>
|
|
</div>
|
|
<p>Compiles the current query builder.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> toSql: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.type || (<span class="keyword">this</span>.type = <span class="string">'select'</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.grammar[<span class="string">'compile'</span> + capitalize(<span class="keyword">this</span>.type)](<span class="keyword">this</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-54">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-54">¶</a>
|
|
</div>
|
|
<p>Clones the current query builder, including any
|
|
pieces that have been set thus far.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> clone: <span class="keyword">function</span>() {
|
|
<span class="keyword">var</span> item = <span class="keyword">new</span> Builder(<span class="keyword">this</span>.table);
|
|
item.client = <span class="keyword">this</span>.client;
|
|
item.grammar = <span class="keyword">this</span>.grammar;
|
|
<span class="keyword">var</span> items = [
|
|
<span class="string">'_idAttribute'</span>, <span class="string">'isDistinct'</span>, <span class="string">'joins'</span>, <span class="string">'wheres'</span>, <span class="string">'orders'</span>,
|
|
<span class="string">'columns'</span>, <span class="string">'bindings'</span>, <span class="string">'grammar'</span>, <span class="string">'transaction'</span>, <span class="string">'unions'</span>
|
|
];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = items.length; i < l; i++) {
|
|
<span class="keyword">var</span> k = items[i];
|
|
item[k] = <span class="keyword">this</span>[k];
|
|
}
|
|
<span class="keyword">return</span> item;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-55">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-55">¶</a>
|
|
</div>
|
|
<p>Resets all attributes on the query builder.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> reset: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.joins = [];
|
|
<span class="keyword">this</span>.values = [];
|
|
<span class="keyword">this</span>.unions = [];
|
|
<span class="keyword">this</span>.wheres = [];
|
|
<span class="keyword">this</span>.orders = [];
|
|
<span class="keyword">this</span>.columns = [];
|
|
<span class="keyword">this</span>.bindings = [];
|
|
<span class="keyword">this</span>.isDistinct = <span class="literal">false</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-56">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-56">¶</a>
|
|
</div>
|
|
<p>Adds a join clause to the query, allowing for advanced joins
|
|
with an anonymous function as the second argument.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> join: <span class="keyword">function</span>(table, first, operator, second, type) {
|
|
<span class="keyword">var</span> join;
|
|
<span class="keyword">if</span> (_.isFunction(first)) {
|
|
type = operator;
|
|
join = <span class="keyword">new</span> JoinClause(type || <span class="string">'inner'</span>, table);
|
|
first.call(join, join);
|
|
} <span class="keyword">else</span> {
|
|
join = <span class="keyword">new</span> JoinClause(type || <span class="string">'inner'</span>, table);
|
|
join.on(first, operator, second);
|
|
}
|
|
<span class="keyword">this</span>.joins.push(join);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-57">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-57">¶</a>
|
|
</div>
|
|
<p>The where function can be used in several ways:
|
|
The most basic is <code>where(key, value)</code>, which expands to
|
|
where key = value.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> where: <span class="keyword">function</span>(column, operator, value, bool) {
|
|
bool || (bool = <span class="string">'and'</span>);
|
|
<span class="keyword">if</span> (_.isFunction(column)) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._whereNested(column, bool);
|
|
}
|
|
<span class="keyword">if</span> (_.isObject(column)) {
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> key <span class="keyword">in</span> column) {
|
|
value = column[key];
|
|
<span class="keyword">this</span>[bool + <span class="string">'Where'</span>](key, <span class="string">'='</span>, value);
|
|
}
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
}
|
|
<span class="keyword">if</span> (!_.contains(operators, operator)) {
|
|
value = operator;
|
|
operator = <span class="string">'='</span>;
|
|
}
|
|
<span class="keyword">if</span> (_.isFunction(value)) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._whereSub(column, operator, value, bool);
|
|
}
|
|
<span class="keyword">this</span>.wheres.push({
|
|
type: <span class="string">'Basic'</span>,
|
|
column: column,
|
|
operator: operator,
|
|
value: value,
|
|
bool: bool
|
|
});
|
|
<span class="keyword">this</span>.bindings.push(value);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-58">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-58">¶</a>
|
|
</div>
|
|
<p>Alias to <code>where</code>, for internal builder consistency.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> andWhere: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.where.apply(<span class="keyword">this</span>, arguments);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-59">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-59">¶</a>
|
|
</div>
|
|
<p>Adds an <code>or where</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhere: <span class="keyword">function</span>(column, operator, value) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.where(column, operator, value, <span class="string">'or'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-60">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-60">¶</a>
|
|
</div>
|
|
<p>Adds a raw <code>where</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereRaw: <span class="keyword">function</span>(sql, bindings, bool) {
|
|
bindings || (bindings = []);
|
|
bool || (bool = <span class="string">'and'</span>);
|
|
<span class="keyword">this</span>.wheres.push({type: <span class="string">'Raw'</span>, sql:sql, bool:bool});
|
|
push.apply(<span class="keyword">this</span>.bindings, bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-61">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-61">¶</a>
|
|
</div>
|
|
<p>Adds a raw <code>or where</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereRaw: <span class="keyword">function</span>(sql, bindings) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereRaw(sql, bindings, <span class="string">'or'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-62">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-62">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where exists</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereExists: <span class="keyword">function</span>(callback, bool, type) {
|
|
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
|
|
callback.call(query, query);
|
|
<span class="keyword">this</span>.wheres.push({
|
|
type: (type || <span class="string">'Exists'</span>),
|
|
query: query,
|
|
bool: (bool || <span class="string">'and'</span>)
|
|
});
|
|
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-63">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-63">¶</a>
|
|
</div>
|
|
<p>Adds an <code>or where exists</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereExists: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereExists(callback, <span class="string">'or'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-64">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-64">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where not exists</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNotExists: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereExists(callback, <span class="string">'and'</span>, <span class="string">'NotExists'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-65">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-65">¶</a>
|
|
</div>
|
|
<p>Adds a <code>or where not exists</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereNotExists: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereExists(callback, <span class="string">'or'</span>, <span class="string">'NotExists'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-66">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-66">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where in</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereIn: <span class="keyword">function</span>(column, values, bool, condition) {
|
|
bool || (bool = <span class="string">'and'</span>);
|
|
<span class="keyword">if</span> (_.isFunction(values)) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._whereInSub(column, values, bool, (condition || <span class="string">'In'</span>));
|
|
}
|
|
<span class="keyword">this</span>.wheres.push({
|
|
type: (condition || <span class="string">'In'</span>),
|
|
column: column,
|
|
value: values,
|
|
bool: bool
|
|
});
|
|
push.apply(<span class="keyword">this</span>.bindings, values);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-67">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-67">¶</a>
|
|
</div>
|
|
<p>Adds a <code>or where in</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereIn: <span class="keyword">function</span>(column, values) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereIn(column, values, <span class="string">'or'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-68">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-68">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where not in</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNotIn: <span class="keyword">function</span>(column, values) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereIn(column, values, <span class="string">'and'</span>, <span class="string">'NotIn'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-69">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-69">¶</a>
|
|
</div>
|
|
<p>Adds a <code>or where not in</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereNotIn: <span class="keyword">function</span>(column, values) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereIn(column, values, <span class="string">'or'</span>, <span class="string">'NotIn'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-70">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-70">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where null</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNull: <span class="keyword">function</span>(column, bool, type) {
|
|
<span class="keyword">this</span>.wheres.push({type: (type || <span class="string">'Null'</span>), column: column, bool: (bool || <span class="string">'and'</span>)});
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-71">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-71">¶</a>
|
|
</div>
|
|
<p>Adds a <code>or where null</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereNull: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereNull(column, <span class="string">'or'</span>, <span class="string">'Null'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-72">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-72">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where not null</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereNotNull: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereNull(column, <span class="string">'and'</span>, <span class="string">'NotNull'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-73">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-73">¶</a>
|
|
</div>
|
|
<p>Adds a <code>or where not null</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereNotNull: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.whereNull(column, <span class="string">'or'</span>, <span class="string">'NotNull'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-74">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-74">¶</a>
|
|
</div>
|
|
<p>Adds a <code>where between</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> whereBetween: <span class="keyword">function</span>(column, values) {
|
|
<span class="keyword">this</span>.wheres.push({column: column, type: <span class="string">'Between'</span>, bool: <span class="string">'and'</span>});
|
|
push.apply(<span class="keyword">this</span>.bindings, values);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-75">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-75">¶</a>
|
|
</div>
|
|
<p>Adds a <code>or where between</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orWhereBetween: <span class="keyword">function</span>(column, values) {
|
|
<span class="keyword">this</span>.wheres.push({column: column, type: <span class="string">'Between'</span>, bool: <span class="string">'or'</span>});
|
|
push.apply(<span class="keyword">this</span>.bindings, values);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-76">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-76">¶</a>
|
|
</div>
|
|
<hr>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-77">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-77">¶</a>
|
|
</div>
|
|
<p>Adds a <code>group by</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> groupBy: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.groups = (<span class="keyword">this</span>.groups || []).concat(_.toArray(arguments));
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-78">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-78">¶</a>
|
|
</div>
|
|
<p>Adds a <code>order by</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> orderBy: <span class="keyword">function</span>(column, direction) {
|
|
<span class="keyword">this</span>.orders.push({column: column, direction: (direction || <span class="string">'asc'</span>)});
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-79">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-79">¶</a>
|
|
</div>
|
|
<p>Add a union statement to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> union: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">this</span>._union(callback, <span class="literal">false</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-80">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-80">¶</a>
|
|
</div>
|
|
<p>Adds a union all statement to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> unionAll: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">this</span>._union(callback, <span class="literal">true</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-81">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-81">¶</a>
|
|
</div>
|
|
<p>Adds a <code>having</code> clause to the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> having: <span class="keyword">function</span>(column, operator, value) {
|
|
<span class="keyword">this</span>.havings.push({column: column, operator: (operator || <span class="string">''</span>), value: (value || <span class="string">''</span>)});
|
|
<span class="keyword">this</span>.bindings.push(value);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},
|
|
|
|
havingRaw: <span class="keyword">function</span>(sql, bindings) {
|
|
<span class="keyword">this</span>.havings.push({type: <span class="string">'Raw'</span>, sql: sql, bool: <span class="string">'and'</span>});
|
|
<span class="keyword">this</span>.bindings.push(bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},
|
|
|
|
orHavingRaw: <span class="keyword">function</span>(sql, bindings) {
|
|
<span class="keyword">this</span>.havings.push({type: <span class="string">'Raw'</span>, sql: sql, bool: <span class="string">'or'</span>});
|
|
<span class="keyword">this</span>.bindings.push(bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-82">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-82">¶</a>
|
|
</div>
|
|
<hr>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-83">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-83">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> offset: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">if</span> (value == <span class="literal">null</span>) <span class="keyword">return</span> <span class="keyword">this</span>.isOffset;
|
|
<span class="keyword">this</span>.isOffset = value;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},
|
|
|
|
limit: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">if</span> (value == <span class="literal">null</span>) <span class="keyword">return</span> <span class="keyword">this</span>.isLimit;
|
|
<span class="keyword">this</span>.isLimit = value;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-84">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-84">¶</a>
|
|
</div>
|
|
<hr>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-85">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-85">¶</a>
|
|
</div>
|
|
<p>Retrieve the "count" result of the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> count: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'count'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-86">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-86">¶</a>
|
|
</div>
|
|
<p>Retrieve the minimum value of a given column.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> min: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'min'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-87">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-87">¶</a>
|
|
</div>
|
|
<p>Retrieve the maximum value of a given column.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> max: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'max'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-88">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-88">¶</a>
|
|
</div>
|
|
<p>Retrieve the sum of the values of a given column.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> sum: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._aggregate(<span class="string">'sum'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-89">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-89">¶</a>
|
|
</div>
|
|
<p>Increments a column's value by the specified amount.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> increment: <span class="keyword">function</span>(column, amount) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._counter(column, amount);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-90">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-90">¶</a>
|
|
</div>
|
|
<p>Decrements a column's value by the specified amount.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> decrement: <span class="keyword">function</span>(column, amount) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._counter(column, amount, <span class="string">'-'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-91">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-91">¶</a>
|
|
</div>
|
|
<p>Sets the values for a <code>select</code> query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> select: <span class="keyword">function</span>(columns) {
|
|
<span class="keyword">if</span> (columns) {
|
|
push.apply(<span class="keyword">this</span>.columns, _.isArray(columns) ? columns : _.toArray(arguments));
|
|
}
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'select'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-92">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-92">¶</a>
|
|
</div>
|
|
<p>Sets the values for an <code>insert</code> query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> insert: <span class="keyword">function</span>(values) {
|
|
<span class="keyword">this</span>.values = <span class="keyword">this</span>._prepValues(values);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'insert'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-93">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-93">¶</a>
|
|
</div>
|
|
<p>Sets the values for an <code>update</code> query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> update: <span class="keyword">function</span>(values) {
|
|
<span class="keyword">var</span> obj = sortObject(values);
|
|
<span class="keyword">var</span> bindings = [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = obj.length; i < l; i++) {
|
|
bindings[i] = obj[i][<span class="number">1</span>];
|
|
}
|
|
<span class="keyword">this</span>.bindings = bindings.concat(<span class="keyword">this</span>.bindings || []);
|
|
<span class="keyword">this</span>.values = obj;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'update'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-94">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-94">¶</a>
|
|
</div>
|
|
<p>Alias to del.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="string">"delete"</span>: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'delete'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-95">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-95">¶</a>
|
|
</div>
|
|
<p>Executes a delete statement on the query;</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> del: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'delete'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-96">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-96">¶</a>
|
|
</div>
|
|
<p>Truncate</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> truncate: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'truncate'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-97">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-97">¶</a>
|
|
</div>
|
|
<p>Set by <code>transacting</code> - contains the object with the connection
|
|
needed to execute a transaction</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> transaction: <span class="literal">false</span>,</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-98">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-98">¶</a>
|
|
</div>
|
|
<p>Sets the current Builder connection to that of the
|
|
the currently running transaction</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> transacting: <span class="keyword">function</span>(t) {
|
|
<span class="keyword">if</span> (!t) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'A transaction object must be passed to "transacting".'</span>);
|
|
<span class="keyword">this</span>.transaction = t;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-99">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-99">¶</a>
|
|
</div>
|
|
<hr>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-100">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-100">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _prepValues: <span class="keyword">function</span>(values) {
|
|
<span class="keyword">if</span> (!_.isArray(values)) values = values ? [values] : [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = values.length; i<l; i++) {
|
|
<span class="keyword">var</span> obj = sortObject(values[i]);
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i2 = <span class="number">0</span>, l2 = obj.length; i2 < l2; i2++) {
|
|
<span class="keyword">this</span>.bindings.push(obj[i2][<span class="number">1</span>]);
|
|
}
|
|
}
|
|
<span class="keyword">return</span> values;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-101">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-101">¶</a>
|
|
</div>
|
|
<p>Helper for compiling any advanced <code>where in</code> queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _whereInSub: <span class="keyword">function</span>(column, callback, bool, condition) {
|
|
condition += <span class="string">'Sub'</span>;
|
|
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
|
|
callback.call(query, query);
|
|
<span class="keyword">this</span>.wheres.push({type: condition, column: column, query: query, bool: bool});
|
|
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-102">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-102">¶</a>
|
|
</div>
|
|
<p>Helper for compiling any advanced <code>where</code> queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _whereNested: <span class="keyword">function</span>(callback, bool) {
|
|
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
|
|
query.table = <span class="keyword">this</span>.table;
|
|
callback.call(query, query);
|
|
<span class="keyword">this</span>.wheres.push({type: <span class="string">'Nested'</span>, query: query, bool: bool});
|
|
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-103">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-103">¶</a>
|
|
</div>
|
|
<p>Helper for compiling any of the <code>where</code> advanced queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _whereSub: <span class="keyword">function</span>(column, operator, callback, bool) {
|
|
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
|
|
callback.call(query, query);
|
|
<span class="keyword">this</span>.wheres.push({
|
|
type: <span class="string">'Sub'</span>,
|
|
column: column,
|
|
operator: operator,
|
|
query: query,
|
|
bool: bool
|
|
});
|
|
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-104">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-104">¶</a>
|
|
</div>
|
|
<p>Helper for compiling any aggregate queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _aggregate: <span class="keyword">function</span>(type, columns) {
|
|
<span class="keyword">if</span> (!_.isArray(columns)) columns = [columns];
|
|
<span class="keyword">this</span>.aggregate = {type: type, columns: columns};
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'select'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-105">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-105">¶</a>
|
|
</div>
|
|
<p>Helper for the incrementing/decrementing queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _counter: <span class="keyword">function</span>(column, amount, symbol) {
|
|
<span class="keyword">var</span> sql = {};
|
|
sql[column] = <span class="keyword">new</span> Raw(<span class="string">''</span> + <span class="keyword">this</span>.grammar.wrap(column) + <span class="string">' '</span> + (symbol || <span class="string">'+'</span>) + <span class="string">' '</span> + amount);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.update(sql);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-106">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-106">¶</a>
|
|
</div>
|
|
<p>Helper for compiling any <code>union</code> queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _union: <span class="keyword">function</span>(callback, bool) {
|
|
<span class="keyword">var</span> query = <span class="keyword">new</span> Builder(<span class="keyword">this</span>);
|
|
callback.call(query, query);
|
|
<span class="keyword">this</span>.unions.push({query: query, all: bool});
|
|
push.apply(<span class="keyword">this</span>.bindings, query.bindings);
|
|
}
|
|
|
|
});</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-107">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-107">¶</a>
|
|
</div>
|
|
<h2>Knex.JoinClause</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-108">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-108">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> JoinClause = Knex.JoinClause = <span class="keyword">function</span>(type, table) {
|
|
<span class="keyword">this</span>.clauses = [];
|
|
<span class="keyword">this</span>.type = type;
|
|
<span class="keyword">this</span>.table = table;
|
|
};
|
|
|
|
JoinClause.prototype = {
|
|
|
|
on: <span class="keyword">function</span>(first, operator, second) {
|
|
<span class="keyword">this</span>.clauses.push({first: first, operator: operator, second: second, bool: <span class="string">'and'</span>});
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},
|
|
|
|
andOn: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.on.apply(<span class="keyword">this</span>, arguments);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},
|
|
|
|
orOn: <span class="keyword">function</span>(first, operator, second) {
|
|
<span class="keyword">this</span>.clauses.push({first: first, operator: operator, second: second, bool: <span class="string">'or'</span>});
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
}
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-109">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-109">¶</a>
|
|
</div>
|
|
<h2>Knex.Transaction</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-110">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-110">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Knex.Transaction = <span class="keyword">function</span>(container) {
|
|
<span class="keyword">if</span> (!Knex.Instances[<span class="string">'main'</span>]) {
|
|
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The Knex instance has not been initialized yet.'</span>);
|
|
}
|
|
<span class="keyword">return</span> transaction.call(Knex.Instances[<span class="string">'main'</span>], container);
|
|
};
|
|
|
|
<span class="keyword">var</span> transaction = <span class="keyword">function</span>(container) {
|
|
<span class="keyword">var</span> client = <span class="keyword">this</span>.client;
|
|
<span class="keyword">return</span> client.startTransaction().then(<span class="keyword">function</span>(connection) {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-111">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-111">¶</a>
|
|
</div>
|
|
<p>Initiate a deferred object, so we know when the
|
|
transaction completes or fails, we know what to do.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> dfd = When.defer();</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-112">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-112">¶</a>
|
|
</div>
|
|
<p>Call the container with the transaction
|
|
commit & rollback objects</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> container({
|
|
commit: <span class="keyword">function</span>() {
|
|
client.finishTransaction(<span class="string">'commit'</span>, <span class="keyword">this</span>, dfd);
|
|
},
|
|
rollback: <span class="keyword">function</span>() {
|
|
client.finishTransaction(<span class="string">'rollback'</span>, <span class="keyword">this</span>, dfd);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-113">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-113">¶</a>
|
|
</div>
|
|
<p>"rollback to"?</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> connection: connection
|
|
});
|
|
|
|
<span class="keyword">return</span> dfd.promise;
|
|
});
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-114">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-114">¶</a>
|
|
</div>
|
|
<h2>Knex.Schema</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-115">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-115">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> initSchema = <span class="keyword">function</span>(Target, client) {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-116">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-116">¶</a>
|
|
</div>
|
|
<p>Top level object for Schema related functions</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Schema = Target.Schema = {};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-117">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-117">¶</a>
|
|
</div>
|
|
<p>Attach main static methods, which passthrough to the
|
|
SchemaBuilder instance methods</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _.each([<span class="string">'hasTable'</span>, <span class="string">'createTable'</span>, <span class="string">'table'</span>, <span class="string">'dropTable'</span>, <span class="string">'renameTable'</span>, <span class="string">'dropTableIfExists'</span>], <span class="keyword">function</span>(method) {
|
|
|
|
Schema[method] = <span class="keyword">function</span>() {
|
|
<span class="keyword">var</span> args = _.toArray(arguments);
|
|
<span class="keyword">var</span> builder = <span class="keyword">new</span> Knex.SchemaBuilder(args[<span class="number">0</span>]);
|
|
builder.client = client;
|
|
builder.grammar = client.schemaGrammar;
|
|
<span class="keyword">return</span> SchemaInterface[method].apply(builder, args.slice(<span class="number">1</span>));
|
|
};
|
|
});
|
|
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-118">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-118">¶</a>
|
|
</div>
|
|
<p>All of the Schame methods that should be called with a
|
|
<code>SchemaBuilder</code> context, to disallow calling more than one method at once.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> SchemaInterface = {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-119">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-119">¶</a>
|
|
</div>
|
|
<p>Modify a table on the schema.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> table: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">this</span>.callback(callback);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'table'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-120">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-120">¶</a>
|
|
</div>
|
|
<p>Create a new table on the schema.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> createTable: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">this</span>._addCommand(<span class="string">'createTable'</span>);
|
|
<span class="keyword">this</span>.callback(callback);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'createTable'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-121">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-121">¶</a>
|
|
</div>
|
|
<p>Drop a table from the schema.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropTable: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>._addCommand(<span class="string">'dropTable'</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'dropTable'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-122">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-122">¶</a>
|
|
</div>
|
|
<p>Drop a table from the schema if it exists.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropTableIfExists: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>._addCommand(<span class="string">'dropTableIfExists'</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'dropTableIfExists'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-123">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-123">¶</a>
|
|
</div>
|
|
<p>Rename a table on the schema.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> renameTable: <span class="keyword">function</span>(to) {
|
|
<span class="keyword">this</span>._addCommand(<span class="string">'renameTable'</span>, {to: to});
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'renameTable'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-124">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-124">¶</a>
|
|
</div>
|
|
<p>Determine if the given table exists.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> hasTable: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.bindings.push(<span class="keyword">this</span>.table);
|
|
<span class="keyword">this</span>._addCommand(<span class="string">'tableExists'</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._setType(<span class="string">'tableExists'</span>);
|
|
}
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-125">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-125">¶</a>
|
|
</div>
|
|
<h2>Knex.SchemaBuilder</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-126">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-126">¶</a>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> SchemaBuilder = Knex.SchemaBuilder = <span class="keyword">function</span>(table) {
|
|
<span class="keyword">this</span>.table = table;
|
|
<span class="keyword">this</span>.columns = [];
|
|
<span class="keyword">this</span>.commands = [];
|
|
<span class="keyword">this</span>.bindings = [];
|
|
};
|
|
|
|
_.extend(SchemaBuilder.prototype, Common, {
|
|
|
|
_source: <span class="string">'SchemaBuilder'</span>,</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-127">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-127">¶</a>
|
|
</div>
|
|
<p>A callback from the table building <code>Knex.schemaBuilder</code> calls.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> callback: <span class="keyword">function</span>(callback) {
|
|
<span class="keyword">if</span> (callback) callback.call(<span class="keyword">this</span>, <span class="keyword">this</span>);
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-128">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-128">¶</a>
|
|
</div>
|
|
<p>Get the raw sql statements for the blueprint.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> toSql: <span class="keyword">function</span>() {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-129">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-129">¶</a>
|
|
</div>
|
|
<p>Add the commands that are implied by the blueprint.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (<span class="keyword">this</span>.columns.length > <span class="number">0</span> && !<span class="keyword">this</span>.creating()) {
|
|
<span class="keyword">this</span>.commands.unshift(<span class="keyword">new</span> Chainable({name: <span class="string">'add'</span>}));
|
|
}</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-130">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-130">¶</a>
|
|
</div>
|
|
<p>Add indicies</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.columns.length; i < l; i++) {
|
|
<span class="keyword">var</span> column = <span class="keyword">this</span>.columns[i];
|
|
<span class="keyword">var</span> indices = [<span class="string">'primary'</span>, <span class="string">'unique'</span>, <span class="string">'index'</span>];
|
|
|
|
continueIndex:
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i2 = <span class="number">0</span>, l2 = indices.length; i2 < l2; i2++) {
|
|
<span class="keyword">var</span> index = indices[i2];
|
|
<span class="keyword">var</span> indexVar = <span class="string">'is'</span> + capitalize(index);</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-131">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-131">¶</a>
|
|
</div>
|
|
<p>If the index has been specified on the given column, but is simply
|
|
equal to "true" (boolean), no name has been specified for this
|
|
index, so we will simply call the index methods without one.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (column[indexVar] === <span class="literal">true</span>) {
|
|
<span class="keyword">this</span>[index](column);
|
|
<span class="keyword">continue</span> continueIndex;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-132">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-132">¶</a>
|
|
</div>
|
|
<p>If the index has been specified on the column and it is something
|
|
other than boolean true, we will assume a name was provided on
|
|
the index specification, and pass in the name to the method.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> } <span class="keyword">else</span> <span class="keyword">if</span> (_.has(column, indexVar)) {
|
|
<span class="keyword">this</span>[index](column.name, column[indexVar]);
|
|
<span class="keyword">continue</span> continueIndex;
|
|
}
|
|
}
|
|
}
|
|
|
|
<span class="keyword">var</span> statements = [];</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-133">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-133">¶</a>
|
|
</div>
|
|
<p>Each type of command has a corresponding compiler function on the schema
|
|
grammar which is used to build the necessary SQL statements to build
|
|
the blueprint element, so we'll just call that compilers function.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">for</span> (i = <span class="number">0</span>, l = <span class="keyword">this</span>.commands.length; i < l; i++) {
|
|
<span class="keyword">var</span> command = <span class="keyword">this</span>.commands[i];
|
|
<span class="keyword">var</span> method = <span class="string">'compile'</span> + capitalize(command.name);
|
|
<span class="keyword">if</span> (_.has(<span class="keyword">this</span>.grammar, method)) {
|
|
<span class="keyword">var</span> sql = <span class="keyword">this</span>.grammar[method](<span class="keyword">this</span>, command);
|
|
statements = statements.concat(sql);
|
|
}
|
|
}
|
|
|
|
<span class="keyword">return</span> statements;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-134">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-134">¶</a>
|
|
</div>
|
|
<p>Determine if the blueprint has a create command.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> creating: <span class="keyword">function</span>() {
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.commands.length; i < l; i++) {
|
|
<span class="keyword">if</span> (<span class="keyword">this</span>.commands[i].name == <span class="string">'createTable'</span>) <span class="keyword">return</span> <span class="literal">true</span>;
|
|
}
|
|
<span class="keyword">return</span> <span class="literal">false</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-135">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-135">¶</a>
|
|
</div>
|
|
<p>Sets the engine to use when creating the table in MySql</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> engine: <span class="keyword">function</span>(name) {
|
|
<span class="keyword">if</span> (!<span class="keyword">this</span>.creating()) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The `engine` modifier may only be used while creating a table.'</span>);
|
|
<span class="keyword">this</span>.isEngine = name;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-136">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-136">¶</a>
|
|
</div>
|
|
<p>Indicate that the given columns should be dropped.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropColumn: <span class="keyword">function</span>(columns) {
|
|
<span class="keyword">if</span> (!_.isArray(columns)) columns = columns ? [columns] : [];
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addCommand(<span class="string">'dropColumn'</span>, {columns: columns});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-137">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-137">¶</a>
|
|
</div>
|
|
<p>Indicate that the given columns should be dropped.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropColumns: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.dropColumn(arguments);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-138">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-138">¶</a>
|
|
</div>
|
|
<p>Indicate that the given primary key should be dropped.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropPrimary: <span class="keyword">function</span>(index) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropPrimary'</span>, index);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-139">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-139">¶</a>
|
|
</div>
|
|
<p>Indicate that the given unique key should be dropped.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropUnique: <span class="keyword">function</span>(index) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropUnique'</span>, index);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-140">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-140">¶</a>
|
|
</div>
|
|
<p>Indicate that the given index should be dropped.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropIndex: <span class="keyword">function</span>(index) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropIndex'</span>, index);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-141">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-141">¶</a>
|
|
</div>
|
|
<p>Indicate that the given foreign key should be dropped.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dropForeign: <span class="keyword">function</span>(index) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._dropIndexCommand(<span class="string">'dropForeign'</span>, index);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-142">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-142">¶</a>
|
|
</div>
|
|
<p>Specify the primary key(s) for the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> primary: <span class="keyword">function</span>(columns, name) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'primary'</span>, columns, name);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-143">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-143">¶</a>
|
|
</div>
|
|
<p>Specify a unique index for the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> unique: <span class="keyword">function</span>(columns, name) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'unique'</span>, columns, name);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-144">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-144">¶</a>
|
|
</div>
|
|
<p>Specify an index for the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> index: <span class="keyword">function</span>(columns, name) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'index'</span>, columns, name);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-145">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-145">¶</a>
|
|
</div>
|
|
<p>Specify a foreign key for the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> foreign: <span class="keyword">function</span>(columns, name) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(<span class="string">'foreign'</span>, columns, name);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-146">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-146">¶</a>
|
|
</div>
|
|
<p>Create a new auto-incrementing column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> increments: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'integer'</span>, (column || <span class="string">'id'</span>), {autoIncrement: <span class="literal">true</span>, length: <span class="number">11</span>});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-147">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-147">¶</a>
|
|
</div>
|
|
<p>Create a new string column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> string: <span class="keyword">function</span>(column, length) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'string'</span>, column, {length: (length || <span class="number">255</span>)});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-148">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-148">¶</a>
|
|
</div>
|
|
<p>Alias varchar to string</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> varchar: <span class="keyword">function</span>(column, length) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.string(column, length);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-149">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-149">¶</a>
|
|
</div>
|
|
<p>Create a new text column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> text: <span class="keyword">function</span>(column, length) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'text'</span>, column, {length: (length || <span class="literal">false</span>)});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-150">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-150">¶</a>
|
|
</div>
|
|
<p>Create a new integer column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> integer: <span class="keyword">function</span>(column, length) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'integer'</span>, column, {length: (length || <span class="number">11</span>)});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-151">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-151">¶</a>
|
|
</div>
|
|
<p>Create a new tinyinteger column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> tinyInteger: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'tinyInteger'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-152">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-152">¶</a>
|
|
</div>
|
|
<p>Alias for tinyinteger column.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> tinyint: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.tinyInteger(column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-153">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-153">¶</a>
|
|
</div>
|
|
<p>Create a new float column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> float: <span class="keyword">function</span>(column, precision, scale) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'float'</span>, column, {
|
|
precision: (precision == <span class="literal">null</span> ? <span class="number">8</span> : precision),
|
|
scale: (scale == <span class="literal">null</span> ? <span class="number">2</span> : scale)
|
|
});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-154">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-154">¶</a>
|
|
</div>
|
|
<p>Create a new decimal column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> decimal: <span class="keyword">function</span>(column, precision, scale) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'decimal'</span>, column, {
|
|
precision: (precision == <span class="literal">null</span> ? <span class="number">8</span> : precision),
|
|
scale: (scale == <span class="literal">null</span> ? <span class="number">2</span> : scale)
|
|
});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-155">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-155">¶</a>
|
|
</div>
|
|
<p>Alias to "bool"</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> boolean: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.bool(column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-156">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-156">¶</a>
|
|
</div>
|
|
<p>Create a new boolean column on the table</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> bool: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'boolean'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-157">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-157">¶</a>
|
|
</div>
|
|
<p>Create a new date column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> date: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'date'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-158">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-158">¶</a>
|
|
</div>
|
|
<p>Create a new date-time column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> dateTime: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'dateTime'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-159">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-159">¶</a>
|
|
</div>
|
|
<p>Create a new time column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> time: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'time'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-160">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-160">¶</a>
|
|
</div>
|
|
<p>Create a new timestamp column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> timestamp: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'timestamp'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-161">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-161">¶</a>
|
|
</div>
|
|
<p>Add creation and update timestamps to the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> timestamps: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.timestamp(<span class="string">'created_at'</span>);
|
|
<span class="keyword">this</span>.timestamp(<span class="string">'updated_at'</span>);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-162">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-162">¶</a>
|
|
</div>
|
|
<p>Alias to enum.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="string">"enum"</span>: <span class="keyword">function</span>(column, allowed) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.enu(column, allowed);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-163">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-163">¶</a>
|
|
</div>
|
|
<p>Create a new enum column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> enu: <span class="keyword">function</span>(column, allowed) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'enum'</span>, column, {allowed: allowed});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-164">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-164">¶</a>
|
|
</div>
|
|
<p>Create a new bit column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> bit: <span class="keyword">function</span>(column, length) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'bit'</span>, column, {length: (length || <span class="literal">false</span>)});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-165">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-165">¶</a>
|
|
</div>
|
|
<p>Create a new binary column on the table.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> binary: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addColumn(<span class="string">'binary'</span>, column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-166">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-166">¶</a>
|
|
</div>
|
|
<hr>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-167">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-167">¶</a>
|
|
</div>
|
|
<p>Create a new drop index command on the blueprint.
|
|
If the index is an array of columns, the developer means
|
|
to drop an index merely by specifying the columns involved.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _dropIndexCommand: <span class="keyword">function</span>(type, index) {
|
|
<span class="keyword">var</span> columns = [];
|
|
<span class="keyword">if</span> (_.isArray(index)) {
|
|
columns = index;
|
|
index = <span class="literal">null</span>;
|
|
}
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._indexCommand(type, columns, index);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-168">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-168">¶</a>
|
|
</div>
|
|
<p>Add a new index command to the blueprint.
|
|
If no name was specified for this index, we will create one using a basic
|
|
convention of the table name, followed by the columns, followed by an
|
|
index type, such as primary or index, which makes the index unique.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _indexCommand: <span class="keyword">function</span>(type, columns, index) {
|
|
index || (index = <span class="literal">null</span>);
|
|
<span class="keyword">if</span> (!_.isArray(columns)) columns = columns ? [columns] : [];
|
|
<span class="keyword">if</span> (index === <span class="literal">null</span>) {
|
|
<span class="keyword">var</span> table = <span class="keyword">this</span>.table.replace(<span class="regexp">/\.|-/g</span>, <span class="string">'_'</span>);
|
|
index = (table + <span class="string">'_'</span> + _.map(columns, <span class="keyword">function</span>(col) { <span class="keyword">return</span> col.name; }).join(<span class="string">'_'</span>) + <span class="string">'_'</span> + type).toLowerCase();
|
|
}
|
|
<span class="keyword">return</span> <span class="keyword">this</span>._addCommand(type, {index: index, columns: columns});
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-169">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-169">¶</a>
|
|
</div>
|
|
<p>Add a new column to the blueprint.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _addColumn: <span class="keyword">function</span>(type, name, parameters) {
|
|
<span class="keyword">if</span> (!name) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'A `name` must be defined to add a column'</span>);
|
|
<span class="keyword">var</span> attrs = _.extend({type: type, name: name}, parameters);
|
|
<span class="keyword">var</span> column = <span class="keyword">new</span> Chainable(attrs);
|
|
<span class="keyword">this</span>.columns.push(column);
|
|
<span class="keyword">return</span> column;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-170">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-170">¶</a>
|
|
</div>
|
|
<p>Add a new command to the blueprint.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _addCommand: <span class="keyword">function</span>(name, parameters) {
|
|
<span class="keyword">var</span> command = <span class="keyword">new</span> Chainable(_.extend({name: name}, parameters));
|
|
<span class="keyword">this</span>.commands.push(command);
|
|
<span class="keyword">return</span> command;
|
|
}
|
|
});</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-171">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-171">¶</a>
|
|
</div>
|
|
<p>Chainable object used in creating SchemaBuilder commands.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Chainable = <span class="keyword">function</span>(obj) {
|
|
_.extend(<span class="keyword">this</span>, obj);
|
|
};
|
|
|
|
Chainable.prototype = {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-172">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-172">¶</a>
|
|
</div>
|
|
<p>Sets the default value for a column.
|
|
For <code>boolean</code> columns, we'll permit 'false'
|
|
to be used as default values.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> defaultTo: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">if</span> (<span class="keyword">this</span>.type === <span class="string">'boolean'</span>) {
|
|
<span class="keyword">if</span> (value === <span class="string">'false'</span>) value = <span class="number">0</span>;
|
|
value = (value ? <span class="number">1</span> : <span class="number">0</span>);
|
|
}
|
|
<span class="keyword">this</span>.defaultValue = value;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-173">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-173">¶</a>
|
|
</div>
|
|
<p>Sets an integer as unsigned, is a no-op
|
|
if the column type is not an integer.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> unsigned: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.isUnsigned = <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-174">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-174">¶</a>
|
|
</div>
|
|
<p>Allows the column to contain null values.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> nullable: <span class="keyword">function</span>() {
|
|
<span class="keyword">this</span>.isNullable = <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-175">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-175">¶</a>
|
|
</div>
|
|
<p>Adds an index on the specified column.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> index: <span class="keyword">function</span>(name) {
|
|
<span class="keyword">this</span>.isIndex = name || <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-176">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-176">¶</a>
|
|
</div>
|
|
<p>Sets this column as the primary key.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> primary: <span class="keyword">function</span>(name) {
|
|
<span class="keyword">this</span>.isPrimary = name || <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-177">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-177">¶</a>
|
|
</div>
|
|
<p>Sets this column as unique.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> unique: <span class="keyword">function</span>(name) {
|
|
<span class="keyword">this</span>.isUnique = name || <span class="literal">true</span>;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-178">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-178">¶</a>
|
|
</div>
|
|
<p>Sets the column to be inserted after another,
|
|
used in MySql alter tables.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> after: <span class="keyword">function</span>(name) {
|
|
<span class="keyword">this</span>.isAfter = name;
|
|
<span class="keyword">return</span> <span class="keyword">this</span>;
|
|
}
|
|
|
|
};
|
|
|
|
Knex.SchemaGrammar = {</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-179">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-179">¶</a>
|
|
</div>
|
|
<p>Compile a foreign key command.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> compileForeign: <span class="keyword">function</span>(blueprint, command) {
|
|
<span class="keyword">var</span> table = <span class="keyword">this</span>.wrapTable(blueprint);
|
|
<span class="keyword">var</span> on = <span class="keyword">this</span>.wrapTable(command.on);</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-180">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-180">¶</a>
|
|
</div>
|
|
<p>We need to prepare several of the elements of the foreign key definition
|
|
before we can create the SQL, such as wrapping the tables and convert
|
|
an array of columns to comma-delimited strings for the SQL queries.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> columns = <span class="keyword">this</span>.columnize(command.columns);
|
|
<span class="keyword">var</span> onColumns = <span class="keyword">this</span>.columnize(command.references);
|
|
|
|
<span class="keyword">var</span> sql = <span class="string">"alter table "</span> + table + <span class="string">" add constraint "</span> + command.index + <span class="string">" "</span>;
|
|
sql += <span class="string">"foreign key ("</span> + columns + <span class="string">") references "</span> + on + <span class="string">" ("</span> + onColumns + <span class="string">")"</span>;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-181">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-181">¶</a>
|
|
</div>
|
|
<p>Once we have the basic foreign key creation statement constructed we can
|
|
build out the syntax for what should happen on an update or delete of
|
|
the affected columns, which will get something like "cascade", etc.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (command.onDelete) sql += <span class="string">" on delete "</span> + command.onDelete;
|
|
<span class="keyword">if</span> (command.onUpdate) sql += <span class="string">" on update "</span> + command.onUpdate;
|
|
|
|
<span class="keyword">return</span> sql;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-182">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-182">¶</a>
|
|
</div>
|
|
<p>Each of the column types have their own compiler functions which are
|
|
responsible for turning the column definition into its SQL format
|
|
for the platform. Then column modifiers are compiled and added.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> getColumns: <span class="keyword">function</span>(blueprint) {
|
|
<span class="keyword">var</span> columns = [];
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = blueprint.columns.length; i < l; i++) {
|
|
<span class="keyword">var</span> column = blueprint.columns[i];
|
|
<span class="keyword">var</span> sql = <span class="keyword">this</span>.wrap(column) + <span class="string">' '</span> + <span class="keyword">this</span>.getType(column);
|
|
columns.push(<span class="keyword">this</span>.addModifiers(sql, blueprint, column));
|
|
}
|
|
<span class="keyword">return</span> columns;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-183">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-183">¶</a>
|
|
</div>
|
|
<p>Add the column modifiers to the definition.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> addModifiers: <span class="keyword">function</span>(sql, blueprint, column) {
|
|
<span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>, l = <span class="keyword">this</span>.modifiers.length; i < l; i++) {
|
|
<span class="keyword">var</span> modifier = <span class="keyword">this</span>.modifiers[i];
|
|
<span class="keyword">var</span> method = <span class="string">"modify"</span> + modifier;
|
|
<span class="keyword">if</span> (_.has(<span class="keyword">this</span>, method)) {
|
|
sql += <span class="keyword">this</span>[method](blueprint, column) || <span class="string">''</span>;
|
|
}
|
|
}
|
|
<span class="keyword">return</span> sql;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-184">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-184">¶</a>
|
|
</div>
|
|
<p>Get the SQL for the column data type.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> getType: <span class="keyword">function</span>(column) {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>[<span class="string">"type"</span> + capitalize(column.type)](column);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-185">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-185">¶</a>
|
|
</div>
|
|
<p>Add a prefix to an array of values, utilized in the client libs.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> prefixArray: <span class="keyword">function</span>(prefix, values) {
|
|
<span class="keyword">return</span> _.map(values, <span class="keyword">function</span>(value) { <span class="keyword">return</span> prefix + <span class="string">' '</span> + value; });
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-186">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-186">¶</a>
|
|
</div>
|
|
<p>Wrap a table in keyword identifiers.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> wrapTable: <span class="keyword">function</span>(table) {
|
|
<span class="keyword">if</span> (table <span class="keyword">instanceof</span> SchemaBuilder) table = table.table;
|
|
<span class="keyword">return</span> Knex.Grammar.wrapTable.call(<span class="keyword">this</span>, table);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-187">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-187">¶</a>
|
|
</div>
|
|
<p>Wrap a value in keyword identifiers.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> wrap: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">if</span> (value <span class="keyword">instanceof</span> Chainable) value = value.name;
|
|
<span class="keyword">return</span> Knex.Grammar.wrap.call(<span class="keyword">this</span>, value);
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-188">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-188">¶</a>
|
|
</div>
|
|
<p>Format a value so that it can be used in "default" clauses.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> getDefaultValue: <span class="keyword">function</span>(value) {
|
|
<span class="keyword">if</span> (value <span class="keyword">instanceof</span> Raw) <span class="keyword">return</span> value.value;
|
|
<span class="keyword">if</span> (value === <span class="literal">true</span> || value === <span class="literal">false</span>) {
|
|
<span class="keyword">return</span> parseInt(value, <span class="number">10</span>);
|
|
}
|
|
<span class="keyword">return</span> <span class="string">''</span> + value;
|
|
}
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-189">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-189">¶</a>
|
|
</div>
|
|
<h2>Knex.Raw</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-190">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-190">¶</a>
|
|
</div>
|
|
<p>Helpful for injecting a snippet of raw SQL into a
|
|
<code>Knex</code> block... in most cases, we'll check if the value
|
|
is an instanceof Raw, and if it is, use the supplied value.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Knex.Raw = <span class="keyword">function</span>(value) {
|
|
<span class="keyword">if</span> (!Knex.Instances[<span class="string">'main'</span>]) {
|
|
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The Knex instance has not been initialized yet.'</span>);
|
|
}
|
|
<span class="keyword">return</span> Knex.Instances[<span class="string">'main'</span>].Raw(value);
|
|
};
|
|
|
|
<span class="keyword">var</span> Raw = <span class="keyword">function</span>(value) {
|
|
<span class="keyword">this</span>.value = value;
|
|
};
|
|
|
|
_.extend(Raw.prototype, Common, {
|
|
|
|
_source: <span class="string">'Raw'</span>,</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-191">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-191">¶</a>
|
|
</div>
|
|
<p>Returns the raw sql for the query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> toSql: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> <span class="keyword">this</span>.value;
|
|
},</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-192">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-192">¶</a>
|
|
</div>
|
|
<p>Returns the bindings for a raw query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _cleanBindings: <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> [];
|
|
}
|
|
});</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-193">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-193">¶</a>
|
|
</div>
|
|
<p>Simple capitalization of a word.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> capitalize = <span class="keyword">function</span>(word) {
|
|
<span class="keyword">return</span> word.charAt(<span class="number">0</span>).toUpperCase() + word.slice(<span class="number">1</span>);
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-194">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-194">¶</a>
|
|
</div>
|
|
<p>Sorts an object based on the names.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> sortObject = <span class="keyword">function</span>(obj) {
|
|
<span class="keyword">return</span> _.sortBy(_.pairs(obj), <span class="keyword">function</span>(a) {
|
|
<span class="keyword">return</span> a[<span class="number">0</span>];
|
|
});
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-195">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-195">¶</a>
|
|
</div>
|
|
<p>Sets up a multi-query to be executed with serial promises.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> multiQuery = <span class="keyword">function</span>(builder, i, chain) {
|
|
<span class="keyword">if</span> (chain) {
|
|
<span class="keyword">return</span> <span class="keyword">function</span>() {
|
|
<span class="keyword">return</span> multiQuery(builder, i);
|
|
};
|
|
}
|
|
<span class="keyword">return</span> builder.client.query(_.extend({}, builder, {sql: builder.sql[i]}));
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-196">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap for-h2">
|
|
<a class="pilcrow" href="#section-196">¶</a>
|
|
</div>
|
|
<h2>Knex.Initialize</h2>
|
|
|
|
</div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-197">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-197">¶</a>
|
|
</div>
|
|
<p>Takes a hash of options to initialize the database
|
|
connection. The <code>client</code> is required to choose which client
|
|
path above is loaded, or to specify a custom path to a client.
|
|
Other options, such as <code>connection</code> or <code>pool</code> are passed
|
|
into <code>client.initialize</code>.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Knex.Initialize = <span class="keyword">function</span>(name, options) {
|
|
<span class="keyword">var</span> Target, ClientCtor, client;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-198">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-198">¶</a>
|
|
</div>
|
|
<p>A name for the connection isn't required in
|
|
cases where there is only a single connection.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (_.isObject(name)) {
|
|
options = name;
|
|
name = <span class="string">'main'</span>;
|
|
}</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-199">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-199">¶</a>
|
|
</div>
|
|
<p>Don't try to initialize the same <code>name</code> twice... If necessary,
|
|
delete the instance from <code>Knex.Instances</code>.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (Knex.Instances[name]) {
|
|
<span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'An instance named '</span> + name + <span class="string">' already exists'</span>);
|
|
}
|
|
|
|
client = options.client;
|
|
|
|
<span class="keyword">if</span> (!client) <span class="keyword">throw</span> <span class="keyword">new</span> Error(<span class="string">'The client is required to use Knex.'</span>);</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-200">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-200">¶</a>
|
|
</div>
|
|
<p>Checks if this is a default client. If it's not,
|
|
that means it's a custom lib, set the object to the client.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (_.isString(client)) {
|
|
client = client.toLowerCase();
|
|
ClientCtor = require(Clients[client]);
|
|
} <span class="keyword">else</span> {
|
|
ClientCtor = client;
|
|
}</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-201">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-201">¶</a>
|
|
</div>
|
|
<p>Creates a new instance of the db client, passing the name and options.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> client = <span class="keyword">new</span> ClientCtor(name, _.omit(options, <span class="string">'client'</span>));</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-202">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-202">¶</a>
|
|
</div>
|
|
<p>Setup the grammars specific to the client.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> client.grammar = _.extend({}, Knex.Grammar, client.grammar);
|
|
client.schemaGrammar = _.extend({}, client.grammar, Knex.SchemaGrammar, client.schemaGrammar);</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-203">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-203">¶</a>
|
|
</div>
|
|
<p>If this is named "default" then we're setting this on the Knex</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Target = <span class="keyword">function</span>(table) {
|
|
<span class="keyword">var</span> builder = <span class="keyword">new</span> Knex.Builder(table);
|
|
builder.client = client;
|
|
builder.grammar = client.grammar;
|
|
<span class="keyword">return</span> builder;
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-204">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-204">¶</a>
|
|
</div>
|
|
<p>Inherit static properties, without any that don't apply except
|
|
on the "root" <code>Knex</code>.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> _.extend(Target, _.omit(Knex, <span class="string">'Initialize'</span>, <span class="string">'Instances'</span>, <span class="string">'VERSION'</span>));</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-205">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-205">¶</a>
|
|
</div>
|
|
<p>Initialize the schema builder methods.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">if</span> (name === <span class="string">'main'</span>) {
|
|
initSchema(Knex, client);
|
|
}
|
|
|
|
initSchema(Target, client);</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-206">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-206">¶</a>
|
|
</div>
|
|
<p>Specifically set the client on the current target.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Target.client = client;
|
|
Target.instanceName = name;</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-207">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-207">¶</a>
|
|
</div>
|
|
<p>Setup the transacting function properly for this connection.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Target.Transaction = <span class="keyword">function</span>(handler) {
|
|
<span class="keyword">return</span> transaction.call(<span class="keyword">this</span>, handler);
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-208">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-208">¶</a>
|
|
</div>
|
|
<p>Executes a Raw query.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Target.Raw = <span class="keyword">function</span>(value) {
|
|
<span class="keyword">var</span> raw = <span class="keyword">new</span> Raw(value);
|
|
raw.client = client;
|
|
<span class="keyword">return</span> raw;
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-209">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-209">¶</a>
|
|
</div>
|
|
<p>Add this instance to the global <code>Knex</code> instances, and return.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Knex.Instances[name] = Target;
|
|
|
|
<span class="keyword">return</span> Target;
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-210">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-210">¶</a>
|
|
</div>
|
|
<p>Default client paths, located in the <code>./clients</code> directory.</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> <span class="keyword">var</span> Clients = {
|
|
<span class="string">'mysql'</span> : <span class="string">'./clients/mysql.js'</span>,
|
|
<span class="string">'pg'</span> : <span class="string">'./clients/postgres.js'</span>,
|
|
<span class="string">'postgres'</span> : <span class="string">'./clients/postgres.js'</span>,
|
|
<span class="string">'sqlite'</span> : <span class="string">'./clients/sqlite3.js'</span>,
|
|
<span class="string">'sqlite3'</span> : <span class="string">'./clients/sqlite3.js'</span>
|
|
};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-211">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-211">¶</a>
|
|
</div>
|
|
<p>Named instances of Knex, presumably with different database
|
|
connections, the main instance being named "main"...</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> Knex.Instances = {};</pre></div></div>
|
|
|
|
</li>
|
|
|
|
|
|
<li id="section-212">
|
|
<div class="annotation">
|
|
|
|
<div class="pilwrap ">
|
|
<a class="pilcrow" href="#section-212">¶</a>
|
|
</div>
|
|
<p>Export the Knex module</p>
|
|
|
|
</div>
|
|
|
|
<div class="content"><div class='highlight'><pre> module.exports = Knex;
|
|
|
|
}).call(<span class="keyword">this</span>);</pre></div></div>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|