mirror of
https://github.com/knex/knex.git
synced 2025-12-16 09:38:25 +00:00
82 lines
18 KiB
HTML
82 lines
18 KiB
HTML
<!DOCTYPE html><html lang="en"><head><title>lib/dialects/postgres/index</title></head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"><meta name="groc-relative-root" content="../../../"><meta name="groc-document-path" content="lib/dialects/postgres/index"><meta name="groc-project-path" content="lib/dialects/postgres/index.js"><link rel="stylesheet" type="text/css" media="all" href="../../../assets/style.css"><script type="text/javascript" src="../../../assets/behavior.js"></script><body><div id="meta"><div class="file-path">lib/dialects/postgres/index.js</div></div><div id="document"><div class="segment"><div class="comments "><div class="wrapper"><h2 id="postgresql">PostgreSQL</h2></div></div></div><div class="segment"><div class="code"><div class="wrapper"><span class="kd">var</span> <span class="nx">_</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'lodash'</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">inherits</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'inherits'</span><span class="p">);</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">Client</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../client'</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">Promise</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'../../promise'</span><span class="p">);</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">pg</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Always initialize with the "QueryBuilder" and "QueryCompiler"
|
|
objects, which extend the base 'lib/query/builder' and
|
|
'lib/query/compiler', respectively.</p></div></div><div class="code"><div class="wrapper"><span class="kd">function</span> <span class="nx">Client_PG</span><span class="p">(</span><span class="nx">config</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">Client</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">debug</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">isDebugging</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">initDriver</span><span class="p">();</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">initRunner</span><span class="p">();</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">connectionSettings</span> <span class="o">=</span> <span class="nx">config</span><span class="p">.</span><span class="nx">connection</span><span class="p">;</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">initPool</span><span class="p">();</span>
|
|
<span class="k">this</span><span class="p">.</span><span class="nx">pool</span> <span class="o">=</span> <span class="k">new</span> <span class="k">this</span><span class="p">.</span><span class="nx">Pool</span><span class="p">(</span><span class="nx">config</span><span class="p">.</span><span class="nx">pool</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">inherits</span><span class="p">(</span><span class="nx">Client_PG</span><span class="p">,</span> <span class="nx">Client</span><span class="p">);</span>
|
|
|
|
<span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">dialect</span> <span class="o">=</span> <span class="s1">'postgresql'</span><span class="p">,</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Lazy load the pg dependency, since we might just be using
|
|
the client to generate SQL strings.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initDriver</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">pg</span> <span class="o">=</span> <span class="nx">pg</span> <span class="o">||</span> <span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="k">try</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'pg'</span><span class="p">);</span>
|
|
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'pg.js'</span><span class="p">);</span>
|
|
<span class="p">}</span>
|
|
<span class="p">})();</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Attach a <code>Formatter</code> constructor to the client object.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initFormatter</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./formatter'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Attaches the <code>Raw</code> constructor to the client object.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initRaw</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./raw'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Attaches the <code>Transaction</code> constructor to the client object.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initTransaction</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./transaction'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Attaches <code>QueryBuilder</code> and <code>QueryCompiler</code> constructors
|
|
to the client object.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initQuery</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./query'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Initializes a new pool instance for the current client.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initPool</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./pool'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Initialize the query "runner"</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initRunner</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./runner'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Lazy-load the schema dependencies; we may not need to use them.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initSchema</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./schema'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Lazy-load the migration dependency</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">initMigrator</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
|
|
<span class="nx">require</span><span class="p">(</span><span class="s1">'./migrator'</span><span class="p">)(</span><span class="k">this</span><span class="p">);</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="kd">var</span> <span class="nx">utils</span><span class="p">;</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Prep the bindings as needed by PostgreSQL.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">prepBindings</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">bindings</span><span class="p">,</span> <span class="nx">tz</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">utils</span> <span class="o">=</span> <span class="nx">utils</span> <span class="o">||</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'./utils'</span><span class="p">);</span>
|
|
<span class="k">return</span> <span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">bindings</span><span class="p">,</span> <span class="nx">utils</span><span class="p">.</span><span class="nx">prepareValue</span><span class="p">);</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Get a raw connection, called by the <code>pool</code> whenever a new
|
|
connection needs to be added to the pool.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">acquireRawConnection</span> <span class="o">=</span> <span class="nx">Promise</span><span class="p">.</span><span class="nx">method</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">callback</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="kd">var</span> <span class="nx">connection</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">pg</span><span class="p">.</span><span class="nx">Client</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">connectionSettings</span><span class="p">);</span>
|
|
<span class="kd">var</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">this</span><span class="p">;</span>
|
|
<span class="k">return</span> <span class="k">new</span> <span class="nx">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolver</span><span class="p">,</span> <span class="nx">rejecter</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">connection</span><span class="p">.</span><span class="nx">connect</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">rejecter</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">client</span><span class="p">.</span><span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="nx">client</span><span class="p">.</span><span class="nx">checkVersion</span><span class="p">(</span><span class="nx">connection</span><span class="p">).</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">version</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">client</span><span class="p">.</span><span class="nx">version</span> <span class="o">=</span> <span class="nx">version</span><span class="p">;</span>
|
|
<span class="nx">resolver</span><span class="p">(</span><span class="nx">connection</span><span class="p">);</span>
|
|
<span class="p">});</span>
|
|
<span class="p">}</span>
|
|
<span class="nx">resolver</span><span class="p">(</span><span class="nx">connection</span><span class="p">);</span>
|
|
<span class="p">});</span>
|
|
<span class="p">});</span>
|
|
<span class="p">}),</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>Used to explicitly close a connection, called internally by the pool
|
|
when a connection times out or the pool is shutdown.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">destroyRawConnection</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">connection</span><span class="p">.</span><span class="nx">end</span><span class="p">();</span>
|
|
<span class="p">};</span></div></div></div><div class="segment"><div class="comments "><div class="wrapper"><p>In PostgreSQL, we need to do a version check to do some feature
|
|
checking on the database.</p></div></div><div class="code"><div class="wrapper"><span class="nx">Client_PG</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">checkVersion</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">connection</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">return</span> <span class="k">new</span> <span class="nx">Promise</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">resolver</span><span class="p">,</span> <span class="nx">rejecter</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="nx">connection</span><span class="p">.</span><span class="nx">query</span><span class="p">(</span><span class="s1">'select version();'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">err</span><span class="p">,</span> <span class="nx">resp</span><span class="p">)</span> <span class="p">{</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="k">return</span> <span class="nx">rejecter</span><span class="p">(</span><span class="nx">err</span><span class="p">);</span>
|
|
<span class="nx">resolver</span><span class="p">(</span><span class="sr">/^PostgreSQL (.*?) /</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="nx">resp</span><span class="p">.</span><span class="nx">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">version</span><span class="p">)[</span><span class="mi">1</span><span class="p">]);</span>
|
|
<span class="p">});</span>
|
|
<span class="p">});</span>
|
|
<span class="p">};</span>
|
|
|
|
<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Client_PG</span><span class="p">;</span></div></div></div></div></body></html> |