github pages

This commit is contained in:
Jinzhu 2016-02-26 21:58:36 +08:00
parent ffe86980cd
commit bea64d552f
14 changed files with 6466 additions and 66 deletions

View File

@ -1,3 +0,0 @@
# GORM
This is GORM

View File

@ -1,32 +0,0 @@
# Summary
* [Getting Started](getting-started.md)
* [Database](database.md)
* [Connecting to a Database](#connecting-to-a-database)
* [Migration]()
* [Schema]()
* [Models]()
* [Model Defination]()
* [Naming Conventions & Overriding]()
* [Associations]()
* [Belongs To]()
* [Has One]()
* [Has Many]()
* [Many To Many]()
* [Polymorphism]()
* [Association Mode]()
* [CRUD: Reading and Writing Data]()
* [Create]()
* [Query]()
* [Preloading (Eager Loading)]()
* [Update]()
* [Delete / Soft Delete]()
* [Callbacks]()
* [Advanced Usage]()
* [Error Handling]()
* [Transactions]()
* [Raw SQL & SQL Builder]()
* [Composite Primary Key]()
* [Overriding Logger]()
* [Development]()
* [Write Plugins]()

786
advanced.html Normal file
View File

@ -0,0 +1,786 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Advanced Usage · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="To perform a set of operations within a transaction, the general flow is as below.
The database handle returned from db.Begin() should be used for all oper">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="advanced.html" />
<link rel="prev" href="callbacks.html" />
</head>
<body>
<div class="book"
data-level="5"
data-chapter-title="Advanced Usage"
data-filepath="advanced.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter active" data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Advanced Usage</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="advanced-usage">Advanced Usage</h1>
<!-- toc -->
<ul>
<li><a href="#error-handling">Error Handling</a></li>
<li><a href="#transactions">Transactions</a><ul>
<li><a href="#a-specific-example">A Specific Example</a></li>
</ul>
</li>
<li><a href="#raw-sql">Raw SQL</a></li>
<li><a href="#row-rows">Row &amp; Rows</a><ul>
<li><a href="#scan-rows">Scan Rows</a></li>
</ul>
</li>
<li><a href="#composite-primary-key">Composite Primary Key</a></li>
<li><a href="#logger">Logger</a><ul>
<li><a href="#customize-logger">Customize Logger</a></li>
</ul>
</li>
</ul>
<!-- toc stop -->
<h2 id="error-handling">Error Handling</h2>
<pre><code class="lang-go">query <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span>
query <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Limit<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>users<span class="token operator">)</span>
<span class="token comment" spellcheck="true">// query.Error will return the last happened error</span>
<span class="token comment" spellcheck="true">// So you could do error handing in your application like this:</span>
<span class="token keyword">if</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span>Error<span class="token operator">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token operator">{</span>
<span class="token comment" spellcheck="true">// error handling...</span>
<span class="token operator">}</span>
<span class="token comment" spellcheck="true">// RecordNotFound</span>
<span class="token comment" spellcheck="true">// If no record found when you query data, gorm will return RecordNotFound error, you could check it like this:</span>
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;hello world&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span>Error <span class="token operator">==</span> gorm<span class="token operator">.</span>RecordNotFound
<span class="token comment" spellcheck="true">// Or use the shortcut method</span>
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;hello world&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">RecordNotFound<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">if</span> db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Related<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>credit_card<span class="token operator">)</span><span class="token operator">.</span><span class="token function">RecordNotFound<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token comment" spellcheck="true">// no credit card found error handling</span>
<span class="token operator">}</span>
</code></pre>
<h2 id="transactions">Transactions</h2>
<p>To perform a set of operations within a transaction, the general flow is as below.
The database handle returned from <code>db.Begin()</code> should be used for all operations within the transaction.
(Note that all individual save and delete operations are run in a transaction by default.)</p>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// begin</span>
tx <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Begin<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// do some database operations (use &apos;tx&apos; from this point, not &apos;db&apos;)</span>
tx<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">...</span><span class="token operator">)</span>
<span class="token operator">...</span>
<span class="token comment" spellcheck="true">// rollback in case of error</span>
tx<span class="token operator">.</span><span class="token function">Rollback<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Or commit if all is ok</span>
tx<span class="token operator">.</span><span class="token function">Commit<span class="token punctuation">(</span></span><span class="token operator">)</span>
</code></pre>
<h3 id="a-specific-example">A Specific Example</h3>
<pre><code class="lang-go"><span class="token keyword">func</span> <span class="token function">CreateAnimals<span class="token punctuation">(</span></span>db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> err <span class="token operator">{</span>
tx <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Begin<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Note the use of tx as the database handle once you are within a transaction</span>
<span class="token keyword">if</span> err <span class="token operator">:=</span> tx<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>Animal<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">&quot;Giraffe&quot;</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span>Error<span class="token operator">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token operator">{</span>
tx<span class="token operator">.</span><span class="token function">Rollback<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">return</span> err
<span class="token operator">}</span>
<span class="token keyword">if</span> err <span class="token operator">:=</span> tx<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>Animal<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">&quot;Lion&quot;</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span>Error<span class="token operator">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token operator">{</span>
tx<span class="token operator">.</span><span class="token function">Rollback<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">return</span> err
<span class="token operator">}</span>
tx<span class="token operator">.</span><span class="token function">Commit<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">return</span> <span class="token boolean">nil</span>
<span class="token operator">}</span>
</code></pre>
<h2 id="raw-sql">Raw SQL</h2>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Exec<span class="token punctuation">(</span></span><span class="token string">&quot;DROP TABLE users;&quot;</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">Exec<span class="token punctuation">(</span></span><span class="token string">&quot;UPDATE orders SET shipped_at=? WHERE id IN (?)&quot;</span><span class="token operator">,</span> time<span class="token operator">.</span>Now<span class="token operator">,</span> <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">int64</span><span class="token operator">{</span><span class="token number">11</span><span class="token operator">,</span><span class="token number">22</span><span class="token operator">,</span><span class="token number">33</span><span class="token operator">}</span><span class="token operator">)</span>
</code></pre>
<h2 id="row--rows">Row &amp; Rows</h2>
<p>It is even possible to get query result as <code>*sql.Row</code> or <code>*sql.Rows</code></p>
<pre><code class="lang-go">row <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">&quot;users&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">&quot;name, age&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Row<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// (*sql.Row)</span>
row<span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>name<span class="token operator">,</span> <span class="token operator">&amp;</span>age<span class="token operator">)</span>
rows<span class="token operator">,</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">&quot;name, age, email&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// (*sql.Rows, error)</span>
<span class="token keyword">defer</span> rows<span class="token operator">.</span><span class="token function">Close<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">for</span> rows<span class="token operator">.</span><span class="token function">Next<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token operator">...</span>
rows<span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>name<span class="token operator">,</span> <span class="token operator">&amp;</span>age<span class="token operator">,</span> <span class="token operator">&amp;</span>email<span class="token operator">)</span>
<span class="token operator">...</span>
<span class="token operator">}</span>
<span class="token comment" spellcheck="true">// Raw SQL</span>
rows<span class="token operator">,</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Raw<span class="token punctuation">(</span></span><span class="token string">&quot;select name, age, email from users where name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// (*sql.Rows, error)</span>
<span class="token keyword">defer</span> rows<span class="token operator">.</span><span class="token function">Close<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">for</span> rows<span class="token operator">.</span><span class="token function">Next<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token operator">...</span>
rows<span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>name<span class="token operator">,</span> <span class="token operator">&amp;</span>age<span class="token operator">,</span> <span class="token operator">&amp;</span>email<span class="token operator">)</span>
<span class="token operator">...</span>
<span class="token operator">}</span>
</code></pre>
<h3 id="scan-rows">Scan Rows</h3>
<pre><code class="lang-go">rows<span class="token operator">,</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">&quot;name, age, email&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// (*sql.Rows, error)</span>
<span class="token keyword">defer</span> rows<span class="token operator">.</span><span class="token function">Close<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token keyword">for</span> rows<span class="token operator">.</span><span class="token function">Next<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token keyword">var</span> user User
db<span class="token operator">.</span><span class="token function">ScanRows<span class="token punctuation">(</span></span>rows<span class="token operator">,</span> <span class="token operator">&amp;</span>user<span class="token operator">)</span>
<span class="token comment" spellcheck="true">// do something</span>
<span class="token operator">}</span>
</code></pre>
<h2 id="composite-primary-key">Composite Primary Key</h2>
<pre><code class="lang-go"><span class="token keyword">type</span> Product <span class="token keyword">struct</span> <span class="token operator">{</span>
ID <span class="token builtin">string</span> <span class="token string">`gorm:&quot;primary_key&quot;`</span>
LanguageCode <span class="token builtin">string</span> <span class="token string">`gorm:&quot;primary_key&quot;`</span>
<span class="token operator">}</span>
</code></pre>
<h2 id="logger">Logger</h2>
<p>Gorm has built-in logger support</p>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Enable Logger</span>
db<span class="token operator">.</span><span class="token function">LogMode<span class="token punctuation">(</span></span><span class="token boolean">true</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Diable Logger</span>
db<span class="token operator">.</span><span class="token function">LogMode<span class="token punctuation">(</span></span><span class="token boolean">false</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Debug a single operation</span>
db<span class="token operator">.</span><span class="token function">Debug<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">&quot;name = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
</code></pre>
<p><img src="https:/raw.github.com/jinzhu/gorm/master/doc/logger.png" alt="logger"></p>
<h3 id="customize-logger">Customize Logger</h3>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Refer gorm&apos;s default logger for how to: https://github.com/jinzhu/gorm/blob/master/logger.go#files</span>
db<span class="token operator">.</span><span class="token function">SetLogger<span class="token punctuation">(</span></span>gorm<span class="token operator">.</span>Logger<span class="token operator">{</span>revel<span class="token operator">.</span>TRACE<span class="token operator">}</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">SetLogger<span class="token punctuation">(</span></span>log<span class="token operator">.</span><span class="token function">New<span class="token punctuation">(</span></span>os<span class="token operator">.</span>Stdout<span class="token operator">,</span> <span class="token string">&quot;\r\n&quot;</span><span class="token operator">,</span> <span class="token number">0</span><span class="token operator">)</span><span class="token operator">)</span>
</code></pre>
</section>
</div>
</div>
</div>
<a href="callbacks.html" class="navigation navigation-prev " aria-label="Previous page: Callbacks">
<i class="fa fa-angle-left"></i>
</a>
<a href="advanced.html" class="navigation navigation-next " aria-label="Next page: Error Handling">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>

787
associations.html Normal file
View File

@ -0,0 +1,787 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Associations · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="Supports polymorphic has-many and has-one associations.">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="associations.html" />
<link rel="prev" href="models.html" />
</head>
<body>
<div class="book"
data-level="2.3"
data-chapter-title="Associations"
data-filepath="associations.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter active" data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Associations</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="associations">Associations</h1>
<!-- toc -->
<ul>
<li><a href="#belongs-to">Belongs To</a></li>
<li><a href="#has-one">Has One</a></li>
<li><a href="#has-many">Has Many</a></li>
<li><a href="#many-to-many">Many To Many</a></li>
<li><a href="#polymorphism">Polymorphism</a></li>
<li><a href="#association-mode">Association Mode</a></li>
</ul>
<!-- toc stop -->
<h2 id="belongs-to">Belongs To</h2>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// User belongs to a profile, ProfileID is the foreign key</span>
<span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Profile Profile
ProfileID <span class="token builtin">int</span>
<span class="token operator">}</span>
<span class="token keyword">type</span> Profile <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Name <span class="token builtin">string</span>
<span class="token operator">}</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Related<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>profile<span class="token operator">)</span>
<span class="token comment" spellcheck="true">//// SELECT * FROM profiles WHERE id = 111; // 111 is user&apos;s foreign key ProfileID</span>
</code></pre>
<h2 id="has-one">Has One</h2>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// User has one CreditCard, UserID is the foreign key</span>
<span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
CreditCard CreditCard
<span class="token operator">}</span>
<span class="token keyword">type</span> CreditCard <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
UserID <span class="token builtin">uint</span>
Number <span class="token builtin">string</span>
<span class="token operator">}</span>
<span class="token keyword">var</span> card CreditCard
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Related<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>card<span class="token operator">,</span> <span class="token string">&quot;CreditCard&quot;</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">//// SELECT * FROM credit_cards WHERE user_id = 123; // 123 is user&apos;s primary key</span>
<span class="token comment" spellcheck="true">// CreditCard is user&apos;s field name, it means get user&apos;s CreditCard relations and fill it into variable card</span>
<span class="token comment" spellcheck="true">// If the field name is same as the variable&apos;s type name, like above example, it could be omitted, like:</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Related<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>card<span class="token operator">)</span>
</code></pre>
<h2 id="has-many">Has Many</h2>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// User has many emails, UserID is the foreign key</span>
<span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Emails <span class="token operator">[</span><span class="token operator">]</span>Email
<span class="token operator">}</span>
<span class="token keyword">type</span> Email <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Email <span class="token builtin">string</span>
UserID <span class="token builtin">uint</span>
<span class="token operator">}</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Related<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>emails<span class="token operator">)</span>
<span class="token comment" spellcheck="true">//// SELECT * FROM emails WHERE user_id = 111; // 111 is user&apos;s primary key</span>
</code></pre>
<h2 id="many-to-many">Many To Many</h2>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// User has and belongs to many languages, use `user_languages` as join table</span>
<span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Languages <span class="token operator">[</span><span class="token operator">]</span>Language <span class="token string">`gorm:&quot;many2many:user_languages;&quot;`</span>
<span class="token operator">}</span>
<span class="token keyword">type</span> Language <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Name <span class="token builtin">string</span>
<span class="token operator">}</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Related<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>languages<span class="token operator">)</span>
<span class="token comment" spellcheck="true">//// SELECT * FROM &quot;languages&quot; INNER JOIN &quot;user_languages&quot; ON &quot;user_languages&quot;.&quot;language_id&quot; = &quot;languages&quot;.&quot;id&quot; WHERE &quot;user_languages&quot;.&quot;user_id&quot; = 111</span>
</code></pre>
<h2 id="polymorphism">Polymorphism</h2>
<p>Supports polymorphic has-many and has-one associations.</p>
<pre><code class="lang-go"> <span class="token keyword">type</span> Cat <span class="token keyword">struct</span> <span class="token operator">{</span>
Id <span class="token builtin">int</span>
Name <span class="token builtin">string</span>
Toy Toy <span class="token string">`gorm:&quot;polymorphic:Owner;&quot;`</span>
<span class="token operator">}</span>
<span class="token keyword">type</span> Dog <span class="token keyword">struct</span> <span class="token operator">{</span>
Id <span class="token builtin">int</span>
Name <span class="token builtin">string</span>
Toy Toy <span class="token string">`gorm:&quot;polymorphic:Owner;&quot;`</span>
<span class="token operator">}</span>
<span class="token keyword">type</span> Toy <span class="token keyword">struct</span> <span class="token operator">{</span>
Id <span class="token builtin">int</span>
Name <span class="token builtin">string</span>
OwnerId <span class="token builtin">int</span>
OwnerType <span class="token builtin">string</span>
<span class="token operator">}</span>
</code></pre>
<p>Note: polymorphic belongs-to and many-to-many are explicitly NOT supported, and will throw errors.</p>
<h2 id="association-mode">Association Mode</h2>
<p>Association Mode contains some helper methods to handle relationship things easily.</p>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Start Association Mode</span>
<span class="token keyword">var</span> user User
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// `user` is the source, it need to be a valid record (contains primary key)</span>
<span class="token comment" spellcheck="true">// `Languages` is source&apos;s field name for a relationship.</span>
<span class="token comment" spellcheck="true">// If those conditions not matched, will return an error, check it with:</span>
<span class="token comment" spellcheck="true">// db.Model(&amp;user).Association(&quot;Languages&quot;).Error</span>
<span class="token comment" spellcheck="true">// Query - Find out all related associations</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>languages<span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Append - Append new associations for many2many, has_many, will replace current association for has_one, belongs_to</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Append<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span>Language<span class="token operator">{</span>languageZH<span class="token operator">,</span> languageEN<span class="token operator">}</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Append<span class="token punctuation">(</span></span>Language<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">&quot;DE&quot;</span><span class="token operator">}</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Delete - Remove relationship between source &amp; passed arguments, won&apos;t delete those arguments</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span>Language<span class="token operator">{</span>languageZH<span class="token operator">,</span> languageEN<span class="token operator">}</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span>languageZH<span class="token operator">,</span> languageEN<span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Replace - Replace current associations with new one</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Replace<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span>Language<span class="token operator">{</span>languageZH<span class="token operator">,</span> languageEN<span class="token operator">}</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Replace<span class="token punctuation">(</span></span>Language<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">&quot;DE&quot;</span><span class="token operator">}</span><span class="token operator">,</span> languageEN<span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Count - Return the count of current associations</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Count<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Clear - Remove relationship between source &amp; current associations, won&apos;t delete those associations</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Association<span class="token punctuation">(</span></span><span class="token string">&quot;Languages&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Clear<span class="token punctuation">(</span></span><span class="token operator">)</span>
</code></pre>
</section>
</div>
</div>
</div>
<a href="models.html" class="navigation navigation-prev " aria-label="Previous page: Naming Conventions &amp; Overriding">
<i class="fa fa-angle-left"></i>
</a>
<a href="associations.html" class="navigation navigation-next " aria-label="Next page: Belongs To">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>

717
callbacks.html Normal file
View File

@ -0,0 +1,717 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Callbacks · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="Callbacks are methods defined on the pointer of struct.
If any callback returns an error, gorm will stop future operations and rollback all changes.">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="advanced.html" />
<link rel="prev" href="curd.html" />
</head>
<body>
<div class="book"
data-level="4"
data-chapter-title="Callbacks"
data-filepath="callbacks.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter active" data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Callbacks</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="callbacks">Callbacks</h1>
<!-- toc -->
<ul>
<li><a href="#creating-an-object">Creating An Object</a></li>
<li><a href="#updating-an-object">Updating An Object</a></li>
<li><a href="#destroying-an-object">Destroying An Object</a></li>
<li><a href="#after-find">After Find</a></li>
<li><a href="#example">Example</a></li>
</ul>
<!-- toc stop -->
<p>Callbacks are methods defined on the pointer of struct.
If any callback returns an error, gorm will stop future operations and rollback all changes.</p>
<p>Here is the list of all available callbacks:
(listed in the same order in which they will get called during the respective operations)</p>
<h3 id="creating-an-object">Creating An Object</h3>
<pre><code class="lang-go">BeforeSave
BeforeCreate
<span class="token comment" spellcheck="true">// save before associations</span>
<span class="token comment" spellcheck="true">// save self</span>
<span class="token comment" spellcheck="true">// save after associations</span>
AfterCreate
AfterSave
</code></pre>
<h3 id="updating-an-object">Updating An Object</h3>
<pre><code class="lang-go">BeforeSave
BeforeUpdate
<span class="token comment" spellcheck="true">// save before associations</span>
<span class="token comment" spellcheck="true">// save self</span>
<span class="token comment" spellcheck="true">// save after associations</span>
AfterUpdate
AfterSave
</code></pre>
<h3 id="destroying-an-object">Destroying An Object</h3>
<pre><code class="lang-go">BeforeDelete
<span class="token comment" spellcheck="true">// delete self</span>
AfterDelete
</code></pre>
<h3 id="after-find">After Find</h3>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// load data from database</span>
AfterFind
</code></pre>
<h3 id="example">Example</h3>
<pre><code class="lang-go"><span class="token keyword">func</span> <span class="token operator">(</span>u <span class="token operator">*</span>User<span class="token operator">)</span> <span class="token function">BeforeUpdate<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">(</span>err <span class="token builtin">error</span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token keyword">if</span> u<span class="token operator">.</span><span class="token function">readonly<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
err <span class="token operator">=</span> errors<span class="token operator">.</span><span class="token function">New<span class="token punctuation">(</span></span><span class="token string">&quot;read only user&quot;</span><span class="token operator">)</span>
<span class="token operator">}</span>
<span class="token keyword">return</span>
<span class="token operator">}</span>
<span class="token comment" spellcheck="true">// Rollback the insertion if user&apos;s id greater than 1000</span>
<span class="token keyword">func</span> <span class="token operator">(</span>u <span class="token operator">*</span>User<span class="token operator">)</span> <span class="token function">AfterCreate<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">(</span>err <span class="token builtin">error</span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token keyword">if</span> <span class="token operator">(</span>u<span class="token operator">.</span>Id <span class="token operator">&gt;</span> <span class="token number">1000</span><span class="token operator">)</span> <span class="token operator">{</span>
err <span class="token operator">=</span> errors<span class="token operator">.</span><span class="token function">New<span class="token punctuation">(</span></span><span class="token string">&quot;user id is already greater than 1000&quot;</span><span class="token operator">)</span>
<span class="token operator">}</span>
<span class="token keyword">return</span>
<span class="token operator">}</span>
</code></pre>
<p>Save/delete operations in gorm are running in a transaction.
Changes made in that transaction are not visible unless it is commited.
So if you want to use those changes in your callbacks, you need to run your SQL in the same transaction.
For this Gorm supports passing transactions to callbacks like this:</p>
<pre><code class="lang-go"><span class="token keyword">func</span> <span class="token operator">(</span>u <span class="token operator">*</span>User<span class="token operator">)</span> <span class="token function">AfterCreate<span class="token punctuation">(</span></span>tx <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> <span class="token operator">(</span>err <span class="token builtin">error</span><span class="token operator">)</span> <span class="token operator">{</span>
tx<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span>u<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">&quot;role&quot;</span><span class="token operator">,</span> <span class="token string">&quot;admin&quot;</span><span class="token operator">)</span>
<span class="token keyword">return</span>
<span class="token operator">}</span>
</code></pre>
</section>
</div>
</div>
</div>
<a href="curd.html" class="navigation navigation-prev " aria-label="Previous page: Delete / Soft Delete">
<i class="fa fa-angle-left"></i>
</a>
<a href="advanced.html" class="navigation navigation-next " aria-label="Next page: Advanced Usage">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>

1238
curd.html Normal file

File diff suppressed because it is too large Load Diff

779
database.html Normal file
View File

@ -0,0 +1,779 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Database · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="NOTE don&#39;t forgot params parseTime to handle data type time.Time, more support parameters">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="database.html" />
<link rel="prev" href="./" />
</head>
<body>
<div class="book"
data-level="1"
data-chapter-title="Database"
data-filepath="database.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter active" data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Database</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="database">Database</h1>
<!-- toc -->
<ul>
<li><a href="#connecting-to-a-database">Connecting to a database</a><ul>
<li><a href="#mysql">MySQL</a></li>
<li><a href="#postgresql">PostgreSQL</a></li>
<li><a href="#sqlite3">Sqlite3</a></li>
<li><a href="#write-dialect-for-unsupported-databases">Write Dialect for unsupported databases</a></li>
</ul>
</li>
<li><a href="#generic-database-object-sqldb">Generic database object *sql.DB</a></li>
<li><a href="#migration">Migration</a><ul>
<li><a href="#auto-migration">Auto Migration</a></li>
<li><a href="#has-table">Has Table</a></li>
<li><a href="#create-table">Create Table</a></li>
<li><a href="#drop-table">Drop table</a></li>
<li><a href="#modifycolumn">ModifyColumn</a></li>
<li><a href="#dropcolumn">DropColumn</a></li>
<li><a href="#add-foreign-key">Add Foreign Key</a></li>
<li><a href="#indexes">Indexes</a></li>
</ul>
</li>
</ul>
<!-- toc stop -->
<h2 id="connecting-to-a-database">Connecting to a database</h2>
<h4 id="mysql">MySQL</h4>
<p><strong>NOTE</strong> don&apos;t forgot params <code>parseTime</code> to handle data type <code>time.Time</code>, <a href="https://github.com/go-sql-driver/mysql#parameters" target="_blank">more support parameters</a></p>
<pre><code class="lang-go"><span class="token keyword">import</span> <span class="token operator">(</span>
<span class="token string">&quot;github.com/jinzhu/gorm&quot;</span>
<span class="token boolean">_</span> <span class="token string">&quot;github.com/go-sql-driver/mysql&quot;</span>
<span class="token operator">)</span>
<span class="token keyword">func</span> <span class="token function">main<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
db<span class="token operator">,</span> err <span class="token operator">:=</span> gorm<span class="token operator">.</span><span class="token function">Open<span class="token punctuation">(</span></span><span class="token string">&quot;mysql&quot;</span><span class="token operator">,</span> <span class="token string">&quot;user:password@/dbname?charset=utf8&amp;parseTime=True&amp;loc=Local&quot;</span><span class="token operator">)</span>
<span class="token operator">}</span>
</code></pre>
<h4 id="postgresql">PostgreSQL</h4>
<pre><code class="lang-go"><span class="token keyword">import</span> <span class="token operator">(</span>
<span class="token string">&quot;github.com/jinzhu/gorm&quot;</span>
<span class="token boolean">_</span> <span class="token string">&quot;github.com/lib/pq&quot;</span>
<span class="token operator">)</span>
<span class="token keyword">func</span> <span class="token function">main<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
db<span class="token operator">,</span> err <span class="token operator">:=</span> gorm<span class="token operator">.</span><span class="token function">Open<span class="token punctuation">(</span></span><span class="token string">&quot;postgres&quot;</span><span class="token operator">,</span> <span class="token string">&quot;user=gorm dbname=gorm sslmode=disable&quot;</span><span class="token operator">)</span>
<span class="token operator">}</span>
</code></pre>
<h4 id="sqlite3">Sqlite3</h4>
<pre><code class="lang-go"><span class="token keyword">import</span> <span class="token operator">(</span>
<span class="token string">&quot;github.com/jinzhu/gorm&quot;</span>
<span class="token boolean">_</span> <span class="token string">&quot;github.com/mattn/go-sqlite3&quot;</span>
<span class="token operator">)</span>
<span class="token keyword">func</span> <span class="token function">main<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
db<span class="token operator">,</span> err <span class="token operator">:=</span> gorm<span class="token operator">.</span><span class="token function">Open<span class="token punctuation">(</span></span><span class="token string">&quot;sqlite3&quot;</span><span class="token operator">,</span> <span class="token string">&quot;/tmp/gorm.db&quot;</span><span class="token operator">)</span>
<span class="token operator">}</span>
</code></pre>
<h4 id="write-dialect-for-unsupported-databases">Write Dialect for unsupported databases</h4>
<p>GORM officially support above databases, for unsupported databaes, you could write a dialect for that.</p>
<p>Refer: <a href="https://github.com/jinzhu/gorm/blob/master/dialect.go" target="_blank">https://github.com/jinzhu/gorm/blob/master/dialect.go</a></p>
<h2 id="generic-database-object-sqldb">Generic database object *sql.DB</h2>
<p><a href="http://golang.org/pkg/database/sql/#DB" target="_blank">*sql.DB</a></p>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Get generic database object *sql.DB to use its functions</span>
db<span class="token operator">.</span><span class="token function">DB<span class="token punctuation">(</span></span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Connection Pool</span>
db<span class="token operator">.</span><span class="token function">DB<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">SetMaxIdleConns<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">DB<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">SetMaxOpenConns<span class="token punctuation">(</span></span><span class="token number">100</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Ping</span>
db<span class="token operator">.</span><span class="token function">DB<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Ping<span class="token punctuation">(</span></span><span class="token operator">)</span>
</code></pre>
<h2 id="migration">Migration</h2>
<!-- toc -->
<h3 id="auto-migration">Auto Migration</h3>
<p>Automatically migrate your schema, to keep your schema update to date</p>
<p><strong>WARNING</strong> AutoMigrate will ONLY create tables, columns and indexes if doesn&apos;t exist,
WON&apos;T change existing column&apos;s type or delete unused columns to protect your data</p>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">AutoMigrate<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">AutoMigrate<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">,</span> <span class="token operator">&amp;</span>Product<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">,</span> <span class="token operator">&amp;</span>Order<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Add table suffix when create tables</span>
db<span class="token operator">.</span><span class="token function">Set<span class="token punctuation">(</span></span><span class="token string">&quot;gorm:table_options&quot;</span><span class="token operator">,</span> <span class="token string">&quot;ENGINE=InnoDB&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">AutoMigrate<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
</code></pre>
<h3 id="has-table">Has Table</h3>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Check if model `User`&apos;s table has been created or not</span>
db<span class="token operator">.</span><span class="token function">HasTable<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Check table `users` exists or not</span>
db<span class="token operator">.</span><span class="token function">HasTable<span class="token punctuation">(</span></span><span class="token string">&quot;users&quot;</span><span class="token operator">)</span>
</code></pre>
<h3 id="create-table">Create Table</h3>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">CreateTable<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
db<span class="token operator">.</span><span class="token function">Set<span class="token punctuation">(</span></span><span class="token string">&quot;gorm:table_options&quot;</span><span class="token operator">,</span> <span class="token string">&quot;ENGINE=InnoDB&quot;</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">CreateTable<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// will append &quot;ENGINE=InnoDB&quot; to the SQL statement when creating table `users`</span>
</code></pre>
<h3 id="drop-table">Drop table</h3>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">DropTable<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
</code></pre>
<h3 id="modifycolumn">ModifyColumn</h3>
<p>Change column&apos;s type</p>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// change column description&apos;s data type to `text` for model `User`&apos;s table</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">ModifyColumn<span class="token punctuation">(</span></span><span class="token string">&quot;description&quot;</span><span class="token operator">,</span> <span class="token string">&quot;text&quot;</span><span class="token operator">)</span>
</code></pre>
<h3 id="dropcolumn">DropColumn</h3>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">DropColumn<span class="token punctuation">(</span></span><span class="token string">&quot;description&quot;</span><span class="token operator">)</span>
</code></pre>
<h3 id="add-foreign-key">Add Foreign Key</h3>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Add foreign key</span>
<span class="token comment" spellcheck="true">// 1st param : foreignkey field</span>
<span class="token comment" spellcheck="true">// 2nd param : destination table(id)</span>
<span class="token comment" spellcheck="true">// 3rd param : ONDELETE</span>
<span class="token comment" spellcheck="true">// 4th param : ONUPDATE</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">AddForeignKey<span class="token punctuation">(</span></span><span class="token string">&quot;city_id&quot;</span><span class="token operator">,</span> <span class="token string">&quot;cities(id)&quot;</span><span class="token operator">,</span> <span class="token string">&quot;RESTRICT&quot;</span><span class="token operator">,</span> <span class="token string">&quot;RESTRICT&quot;</span><span class="token operator">)</span>
</code></pre>
<h3 id="indexes">Indexes</h3>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Add index</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">AddIndex<span class="token punctuation">(</span></span><span class="token string">&quot;idx_user_name&quot;</span><span class="token operator">,</span> <span class="token string">&quot;name&quot;</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Multiple column index</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">AddIndex<span class="token punctuation">(</span></span><span class="token string">&quot;idx_user_name_age&quot;</span><span class="token operator">,</span> <span class="token string">&quot;name&quot;</span><span class="token operator">,</span> <span class="token string">&quot;age&quot;</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Add unique index</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">AddUniqueIndex<span class="token punctuation">(</span></span><span class="token string">&quot;idx_user_name&quot;</span><span class="token operator">,</span> <span class="token string">&quot;name&quot;</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Multiple column unique index</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">AddUniqueIndex<span class="token punctuation">(</span></span><span class="token string">&quot;idx_user_name_age&quot;</span><span class="token operator">,</span> <span class="token string">&quot;name&quot;</span><span class="token operator">,</span> <span class="token string">&quot;age&quot;</span><span class="token operator">)</span>
<span class="token comment" spellcheck="true">// Remove index</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">RemoveIndex<span class="token punctuation">(</span></span><span class="token string">&quot;idx_user_name&quot;</span><span class="token operator">)</span>
</code></pre>
</section>
</div>
</div>
</div>
<a href="./" class="navigation navigation-prev " aria-label="Previous page: Getting Started with GORM">
<i class="fa fa-angle-left"></i>
</a>
<a href="database.html" class="navigation navigation-next " aria-label="Next page: Database Connection">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>

View File

@ -1,31 +0,0 @@
## Connecting To A Database
```go
import (
"github.com/jinzhu/gorm"
_ "github.com/lib/pq"
_ "github.com/go-sql-driver/mysql"
_ "github.com/mattn/go-sqlite3"
)
func init() {
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
// db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
// db, err := gorm.Open("sqlite3", "/tmp/gorm.db")
// You can also use an existing database connection handle
// dbSql, _ := sql.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
// db, _ := gorm.Open("postgres", dbSql)
// Get database connection handle [*sql.DB](http://golang.org/pkg/database/sql/#DB)
db.DB()
// Then you could invoke `*sql.DB`'s functions with it
db.DB().Ping()
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)
// Disable table name's pluralization
db.SingularTable(true)
}
```

707
development.html Normal file
View File

@ -0,0 +1,707 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Development · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="The most notable component of Gorm isgorm.DB, which hold database connection. It could be initialized like this:">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="development.html" />
<link rel="prev" href="advanced.html" />
</head>
<body>
<div class="book"
data-level="6"
data-chapter-title="Development"
data-filepath="development.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter active" data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Development</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="gorm-development">Gorm Development</h1>
<!-- toc -->
<ul>
<li><a href="#architecture">Architecture</a></li>
<li><a href="#callbacks">Callbacks</a><ul>
<li><a href="#register-a-new-callback">Register a new callback</a></li>
<li><a href="#delete-an-existing-callback">Delete an existing callback</a></li>
<li><a href="#replace-an-existing-callback">Replace an existing callback</a></li>
<li><a href="#register-callback-orders">Register callback orders</a></li>
<li><a href="#callback-api">Callback API</a></li>
</ul>
</li>
</ul>
<!-- toc stop -->
<h2 id="architecture">Architecture</h2>
<p>The most notable component of Gorm is<code>gorm.DB</code>, which hold database connection. It could be initialized like this:</p>
<pre><code>db, err := gorm.Open(&quot;postgres&quot;, &quot;user=gorm dbname=gorm sslmode=disable&quot;)
</code></pre><p>Gorm has chainable API, <code>gorm.DB</code> is the bridge of chains, it save related information and pass it to the next chain.</p>
<p>Lets use below code to explain how it works:</p>
<pre><code>db.Where(&quot;name = ?&quot;, &quot;jinzhu&quot;).Find(&amp;users)
// equivalent code
newdb := db.Where(&quot;name =?&quot;, &quot;jinzhu&quot;)
newdb.Find(&amp;user)
</code></pre><p><code>newdb</code> is <code>db</code>&apos;s clone, in addition, it contains search conditions from the <code>Where</code> method.
<code>Find</code> is a query method, it creates a <code>Scope</code> instance, and pass it as argument to query callbacks.</p>
<p>There are four kinds of callbacks corresponds to sql&apos;s CURD: create callbacks, update callbacks, query callbacks, delete callbacks.</p>
<h2 id="callbacks">Callbacks</h2>
<h3 id="register-a-new-callback">Register a new callback</h3>
<pre><code>func updateCreated(scope *Scope) {
if scope.HasColumn(&quot;Created&quot;) {
scope.SetColumn(&quot;Created&quot;, NowFunc())
}
}
db.Callback().Create().Register(&quot;update_created_at&quot;, updateCreated)
// register a callback for Create process
</code></pre><h3 id="delete-an-existing-callback">Delete an existing callback</h3>
<pre><code>db.Callback().Create().Remove(&quot;gorm:create&quot;)
// delete callback `gorm:create` from Create callbacks
</code></pre><h3 id="replace-an-existing-callback">Replace an existing callback</h3>
<pre><code>db.Callback().Create().Replace(&quot;gorm:create&quot;, newCreateFunction)
// replace callback `gorm:create` with new function `newCreateFunction` for Create process
</code></pre><h3 id="register-callback-orders">Register callback orders</h3>
<pre><code>db.Callback().Create().Before(&quot;gorm:create&quot;).Register(&quot;update_created_at&quot;, updateCreated)
db.Callback().Create().After(&quot;gorm:create&quot;).Register(&quot;update_created_at&quot;, updateCreated)
db.Callback().Query().After(&quot;gorm:query&quot;).Register(&quot;my_plugin:after_query&quot;, afterQuery)
db.Callback().Delete().After(&quot;gorm:delete&quot;).Register(&quot;my_plugin:after_delete&quot;, afterDelete)
db.Callback().Update().Before(&quot;gorm:update&quot;).Register(&quot;my_plugin:before_update&quot;, beforeUpdate)
db.Callback().Create().Before(&quot;gorm:create&quot;).After(&quot;gorm:before_create&quot;).Register(&quot;my_plugin:before_create&quot;, beforeCreate)
</code></pre><h3 id="callback-api">Callback API</h3>
<p>Gorm is powered by callbacks, so you could refer below links to learn how to write callbacks</p>
<p><a href="https://github.com/jinzhu/gorm/blob/master/callback_create.go" target="_blank">Create callbacks</a></p>
<p><a href="https://github.com/jinzhu/gorm/blob/master/callback_update.go" target="_blank">Update callbacks</a></p>
<p><a href="https://github.com/jinzhu/gorm/blob/master/callback_query.go" target="_blank">Query callbacks</a></p>
<p><a href="https://github.com/jinzhu/gorm/blob/master/callback_delete.go" target="_blank">Delete callbacks</a></p>
<p>View <a href="https://github.com/jinzhu/gorm/blob/master/scope.go" target="_blank">https://github.com/jinzhu/gorm/blob/master/scope.go</a> for all available API</p>
</section>
</div>
</div>
</div>
<a href="advanced.html" class="navigation navigation-prev " aria-label="Previous page: Overriding Logger">
<i class="fa fa-angle-left"></i>
</a>
<a href="development.html" class="navigation navigation-next " aria-label="Next page: Write Plugins">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>

View File

1
gitbook Submodule

@ -0,0 +1 @@
Subproject commit 294951f22af41edbbe758fdcd0903195a332b524

704
index.html Normal file
View File

@ -0,0 +1,704 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Getting Started with GORM · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="The fantastic ORM library for Golang, aims to be developer friendly.">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="database.html" />
</head>
<body>
<div class="book"
data-level="0"
data-chapter-title="Getting Started with GORM"
data-filepath="README.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter active" data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Getting Started with GORM</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="gorm">GORM</h1>
<p>The fantastic ORM library for Golang, aims to be developer friendly.</p>
<p><a href="https://app.wercker.com/project/bykey/0cb7bb1039e21b74f8274941428e0921" target="_blank"><img src="https:/app.wercker.com/status/0cb7bb1039e21b74f8274941428e0921/s/master" alt="wercker status" title="wercker status"></a>
<a href="https://godoc.org/github.com/jinzhu/gorm" target="_blank"><img src="https:/godoc.org/github.com/jinzhu/gorm?status.svg" alt="GoDoc"></a>
<a href="https://gitter.im/jinzhu/gorm?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge&amp;utm_content=badge" target="_blank"><img src="https:/badges.gitter.im/Join%20Chat.svg" alt="Join the chat at https://gitter.im/jinzhu/gorm"></a></p>
<h2 id="overview">Overview</h2>
<ul>
<li>Full-Featured ORM (almost)</li>
<li>Chainable API</li>
<li>Auto Migrations</li>
<li>Relations (Has One, Has Many, Belongs To, Many To Many, <a href="#polymorphism">Polymorphism</a>)</li>
<li>Callbacks (Before/After Create/Save/Update/Delete/Find)</li>
<li>Preloading (eager loading)</li>
<li>Transactions</li>
<li>Embed Anonymous Struct</li>
<li>Soft Deletes</li>
<li>Customizable Logger</li>
<li>Iteration Support via <a href="#row--rows">Rows</a></li>
<li>Every feature comes with tests</li>
<li>Developer Friendly</li>
</ul>
<h2 id="install">Install</h2>
<pre><code>go get -u github.com/jinzhu/gorm
</code></pre><h2 id="basic-usage">Basic Usage</h2>
<pre><code class="lang-go"><span class="token keyword">type</span> Product <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Code <span class="token builtin">string</span>
Price <span class="token builtin">uint</span>
<span class="token operator">}</span>
<span class="token keyword">var</span> db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB
<span class="token keyword">func</span> <span class="token function">init<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
<span class="token keyword">var</span> err <span class="token builtin">error</span>
db<span class="token operator">,</span> err <span class="token operator">=</span> gorm<span class="token operator">.</span><span class="token function">Open<span class="token punctuation">(</span></span><span class="token string">&quot;sqlite&quot;</span><span class="token operator">,</span> <span class="token string">&quot;test.db&quot;</span><span class="token operator">)</span>
<span class="token operator">}</span>
<span class="token keyword">func</span> <span class="token function">main<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
db<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>Product<span class="token operator">{</span>Code<span class="token operator">:</span> <span class="token string">&quot;L1212&quot;</span><span class="token operator">,</span> Price<span class="token operator">:</span> <span class="token number">1000</span><span class="token operator">}</span><span class="token operator">)</span>
<span class="token keyword">var</span> product Product
db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>product<span class="token operator">,</span> <span class="token number">1</span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// find product with id 1</span>
db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>product<span class="token operator">,</span> <span class="token string">&quot;code = ?&quot;</span><span class="token operator">,</span> <span class="token string">&quot;L1212&quot;</span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// find product with code l1212</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>product<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">&quot;Price&quot;</span><span class="token operator">,</span> <span class="token number">2000</span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// update product&apos;s price to 2000</span>
db<span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>product<span class="token operator">)</span> <span class="token comment" spellcheck="true">// delete product</span>
<span class="token operator">}</span>
</code></pre>
<h1 id="author">Author</h1>
<p><strong>jinzhu</strong></p>
<ul>
<li><a href="http://github.com/jinzhu" target="_blank">http://github.com/jinzhu</a></li>
<li><a href="mailto:wosmvp@gmail.com" target="_blank">wosmvp@gmail.com</a></li>
<li><a href="http://twitter.com/zhangjinzhu" target="_blank">http://twitter.com/zhangjinzhu</a></li>
</ul>
<h1 id="contributors">Contributors</h1>
<p><a href="https://github.com/jinzhu/gorm/graphs/contributors" target="_blank">https://github.com/jinzhu/gorm/graphs/contributors</a></p>
<h2 id="license">License</h2>
<p>Released under the <a href="https://github.com/jinzhu/gorm/blob/master/License" target="_blank">MIT License</a>.</p>
</section>
</div>
</div>
</div>
<a href="database.html" class="navigation navigation-next navigation-unique" aria-label="Next page: Database">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>

BIN
logger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

747
models.html Normal file
View File

@ -0,0 +1,747 @@
<!DOCTYPE HTML>
<html lang="" >
<head>
<title>Models · GORM Guide</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="description" content="Gorm has defined struct gorm.Model, which could be embeded in your models, it will add fields ID, CreatedAt, UpdatedAt, DeletedAt to your model">
<meta name="generator" content="GitBook 3.0.0-pre.1">
<link rel="stylesheet" href="gitbook/style.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
<meta name="HandheldFriendly" content="true"/>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
<link rel="next" href="models.html" />
<link rel="prev" href="database.html" />
</head>
<body>
<div class="book"
data-level="2"
data-chapter-title="Models"
data-filepath="models.md"
data-basepath=""
data-revision="Fri Feb 26 2016 21:50:14 GMT+0800 (CST)"
data-innerlanguage="">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<li class="chapter " data-level="0" data-path="./">
<a href="./">
Getting Started with GORM
</a>
</li>
<li class="chapter " data-level="1" data-path="database.html">
<a href="database.html">
<b>1.</b>
Database
</a>
<ul class="articles">
<li class="chapter " data-level="1.1" data-path="database.html">
<a href="database.html#connecting-to-a-database">
<b>1.1.</b>
Database Connection
</a>
</li>
<li class="chapter " data-level="1.2" data-path="database.html">
<a href="database.html#migration">
<b>1.2.</b>
Migration
</a>
</li>
</ul>
</li>
<li class="chapter active" data-level="2" data-path="models.html">
<a href="models.html">
<b>2.</b>
Models
</a>
<ul class="articles">
<li class="chapter " data-level="2.1" data-path="models.html">
<a href="models.html#model-defination">
<b>2.1.</b>
Model Defination
</a>
</li>
<li class="chapter " data-level="2.2" data-path="models.html">
<a href="models.html#conventions-overriding-conventions">
<b>2.2.</b>
Naming Conventions &amp; Overriding
</a>
</li>
<li class="chapter " data-level="2.3" data-path="associations.html">
<a href="associations.html">
<b>2.3.</b>
Associations
</a>
<ul class="articles">
<li class="chapter " data-level="2.3.1" data-path="associations.html">
<a href="associations.html#belongs-to">
<b>2.3.1.</b>
Belongs To
</a>
</li>
<li class="chapter " data-level="2.3.2" data-path="associations.html">
<a href="associations.html#has-one">
<b>2.3.2.</b>
Has One
</a>
</li>
<li class="chapter " data-level="2.3.3" data-path="associations.html">
<a href="associations.html#has-many">
<b>2.3.3.</b>
Has Many
</a>
</li>
<li class="chapter " data-level="2.3.4" data-path="associations.html">
<a href="associations.html#many-to-many">
<b>2.3.4.</b>
Many To Many
</a>
</li>
<li class="chapter " data-level="2.3.5" data-path="associations.html">
<a href="associations.html#polymorphism">
<b>2.3.5.</b>
Polymorphism
</a>
</li>
<li class="chapter " data-level="2.3.6" data-path="associations.html">
<a href="associations.html#association-mode">
<b>2.3.6.</b>
Association Mode
</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="chapter " data-level="3" data-path="curd.html">
<a href="curd.html">
<b>3.</b>
CRUD: Reading and Writing Data
</a>
<ul class="articles">
<li class="chapter " data-level="3.1" data-path="curd.html">
<a href="curd.html#create">
<b>3.1.</b>
Create
</a>
</li>
<li class="chapter " data-level="3.2" data-path="curd.html">
<a href="curd.html#query">
<b>3.2.</b>
Query
</a>
</li>
<li class="chapter " data-level="3.3" data-path="curd.html">
<a href="curd.html#preloading">
<b>3.3.</b>
Preloading (Eager Loading)
</a>
</li>
<li class="chapter " data-level="3.4" data-path="curd.html">
<a href="curd.html#update">
<b>3.4.</b>
Update
</a>
</li>
<li class="chapter " data-level="3.5" data-path="curd.html">
<a href="curd.html#delete">
<b>3.5.</b>
Delete / Soft Delete
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="4" data-path="callbacks.html">
<a href="callbacks.html">
<b>4.</b>
Callbacks
</a>
</li>
<li class="chapter " data-level="5" data-path="advanced.html">
<a href="advanced.html">
<b>5.</b>
Advanced Usage
</a>
<ul class="articles">
<li class="chapter " data-level="5.1" data-path="advanced.html">
<a href="advanced.html#error-handling">
<b>5.1.</b>
Error Handling
</a>
</li>
<li class="chapter " data-level="5.2" data-path="advanced.html">
<a href="advanced.html#transactions">
<b>5.2.</b>
Transactions
</a>
</li>
<li class="chapter " data-level="5.3" data-path="advanced.html">
<a href="advanced.html#sql-builder">
<b>5.3.</b>
Raw SQL &amp; SQL Builder
</a>
</li>
<li class="chapter " data-level="5.4" data-path="advanced.html">
<a href="advanced.html#compose-primary-key">
<b>5.4.</b>
Composite Primary Key
</a>
</li>
<li class="chapter " data-level="5.5" data-path="advanced.html">
<a href="advanced.html#logger">
<b>5.5.</b>
Overriding Logger
</a>
</li>
</ul>
</li>
<li class="chapter " data-level="6" data-path="development.html">
<a href="development.html">
<b>6.</b>
Development
</a>
<ul class="articles">
<li class="chapter " data-level="6.1" data-path="development.html">
<a href="development.html#callbacks">
<b>6.1.</b>
Write Plugins
</a>
</li>
</ul>
</li>
<li class="divider"></li>
<li>
<a href="https://www.gitbook.com" target="blank" class="gitbook-link">
Published with GitBook
</a>
</li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<!-- Title -->
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i>
<a href="" >Models</a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal markdown-section">
<h1 id="models">Models</h1>
<!-- toc -->
<ul>
<li><a href="#model-defination">Model Defination</a></li>
<li><a href="#conventions-overriding-conventions">Conventions &amp; Overriding Conventions</a><ul>
<li><a href="#gormmodel-struct"><code>gorm.Model</code> struct</a></li>
<li><a href="#table-name-is-the-pluralized-version-of-struct-name">Table name is the pluralized version of struct name</a></li>
<li><a href="#column-name-is-the-snake-case-of-fields-name">Column name is the snake case of field&apos;s name</a></li>
<li><a href="#field-id-as-primary-key">Field <code>ID</code> as primary key</a></li>
<li><a href="#field-createdat-used-to-store-records-created-time">Field <code>CreatedAt</code> used to store record&apos;s created time</a></li>
<li><a href="#use-updatedat-used-to-store-records-updated-time">Use <code>UpdatedAt</code> used to store record&apos;s updated time</a></li>
<li><a href="#use-deletedat-to-store-records-deleted-time-if-field-exists">Use <code>DeletedAt</code> to store record&apos;s deleted time if field exists</a></li>
</ul>
</li>
</ul>
<!-- toc stop -->
<h2 id="model-defination">Model Defination</h2>
<pre><code class="lang-go"><span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
gorm<span class="token operator">.</span>Model
Birthday time<span class="token operator">.</span>Time
Age <span class="token builtin">int</span>
Name <span class="token builtin">string</span> <span class="token string">`sql:&quot;size:255&quot;`</span> <span class="token comment" spellcheck="true">// Default size for string is 255, you could reset it with this tag</span>
Num <span class="token builtin">int</span> <span class="token string">`sql:&quot;AUTO_INCREMENT&quot;`</span>
IgnoreMe <span class="token builtin">int</span> <span class="token string">`sql:&quot;-&quot;`</span> <span class="token comment" spellcheck="true">// Ignore this field</span>
<span class="token operator">}</span>
</code></pre>
<h2 id="conventions--overriding-conventions">Conventions &amp; Overriding Conventions</h2>
<h3 id="gormmodel-struct"><code>gorm.Model</code> struct</h3>
<p>Gorm has defined struct <code>gorm.Model</code>, which could be embeded in your models, it will add fields <code>ID</code>, <code>CreatedAt</code>, <code>UpdatedAt</code>, <code>DeletedAt</code> to your model</p>
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Model&apos;s definition</span>
<span class="token keyword">type</span> Model <span class="token keyword">struct</span> <span class="token operator">{</span>
ID <span class="token builtin">uint</span> <span class="token string">`gorm:&quot;primary_key&quot;`</span>
CreatedAt time<span class="token operator">.</span>Time
UpdatedAt time<span class="token operator">.</span>Time
DeletedAt <span class="token operator">*</span>time<span class="token operator">.</span>Time
<span class="token operator">}</span>
</code></pre>
<h3 id="table-name-is-the-pluralized-version-of-struct-name">Table name is the pluralized version of struct name</h3>
<pre><code class="lang-go"><span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span><span class="token operator">}</span> <span class="token comment" spellcheck="true">// default table name is `users`</span>
<span class="token comment" spellcheck="true">// set User&apos;s table name to be `profiles</span>
<span class="token keyword">type</span> <span class="token operator">(</span>User<span class="token operator">)</span> <span class="token function">TableName<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token builtin">string</span> <span class="token operator">{</span>
<span class="token keyword">return</span> <span class="token string">&quot;profiles&quot;</span>
<span class="token operator">}</span>
<span class="token keyword">func</span> <span class="token operator">(</span>u User<span class="token operator">)</span> <span class="token function">TableName<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token builtin">string</span> <span class="token operator">{</span>
<span class="token keyword">if</span> u<span class="token operator">.</span>Role <span class="token operator">==</span> <span class="token string">&quot;admin&quot;</span> <span class="token operator">{</span>
<span class="token keyword">return</span> <span class="token string">&quot;admin_users&quot;</span>
<span class="token operator">}</span> <span class="token keyword">else</span> <span class="token operator">{</span>
<span class="token keyword">return</span> <span class="token string">&quot;users&quot;</span>
<span class="token operator">}</span>
<span class="token operator">}</span>
<span class="token comment" spellcheck="true">// Disable table name&apos;s pluralization globally</span>
db<span class="token operator">.</span><span class="token function">SingularTable<span class="token punctuation">(</span></span><span class="token boolean">true</span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// if set this to true, `User`&apos;s default table name will be `user`, table name setted with `TableName` won&apos;t be affected</span>
</code></pre>
<h3 id="column-name-is-the-snake-case-of-fields-name">Column name is the snake case of field&apos;s name</h3>
<pre><code class="lang-go"><span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
ID <span class="token builtin">uint</span> <span class="token comment" spellcheck="true">// column name will be `id`</span>
Name <span class="token builtin">string</span> <span class="token comment" spellcheck="true">// column name will be `name`</span>
Birthday time<span class="token operator">.</span>Time <span class="token comment" spellcheck="true">// column name will be `birthday`</span>
CreatedAt time<span class="token operator">.</span>Time <span class="token comment" spellcheck="true">// column name will be `created_at`</span>
<span class="token operator">}</span>
<span class="token keyword">type</span> Animal <span class="token keyword">struct</span> <span class="token operator">{</span>
AnimalId <span class="token builtin">int64</span> <span class="token string">`gorm:&quot;column:beast_id&quot;`</span> <span class="token comment" spellcheck="true">// set column name to `beast_id`</span>
Birthday time<span class="token operator">.</span>Time <span class="token string">`gorm:&quot;column:day_of_the_beast&quot;`</span> <span class="token comment" spellcheck="true">// set column name to `day_of_the_beast`</span>
Age <span class="token builtin">int64</span> <span class="token string">`gorm:&quot;column:age_of_the_beast&quot;`</span> <span class="token comment" spellcheck="true">// set column name to `age_of_the_beast`</span>
<span class="token operator">}</span>
</code></pre>
<h3 id="field-id-as-primary-key">Field <code>ID</code> as primary key</h3>
<pre><code class="lang-go"><span class="token keyword">type</span> User <span class="token keyword">struct</span> <span class="token operator">{</span>
ID <span class="token builtin">uint</span> <span class="token comment" spellcheck="true">// field named `ID` is the default primary key for `User`</span>
Name <span class="token builtin">string</span>
<span class="token operator">}</span>
<span class="token comment" spellcheck="true">// your could also use tag `primary_key` to set other field as primary key</span>
<span class="token keyword">type</span> Animal <span class="token keyword">struct</span> <span class="token operator">{</span>
AnimalId <span class="token builtin">int64</span> <span class="token string">`gorm:&quot;primary_key&quot;`</span> <span class="token comment" spellcheck="true">// set AnimalId to be primary key</span>
Name <span class="token builtin">string</span>
Age <span class="token builtin">int64</span>
<span class="token operator">}</span>
</code></pre>
<h3 id="field-createdat-used-to-store-records-created-time">Field <code>CreatedAt</code> used to store record&apos;s created time</h3>
<p>Create records having <code>CreatedAt</code> field will set it to current time.</p>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span> <span class="token comment" spellcheck="true">// will set `CreatedAt` to current time</span>
<span class="token comment" spellcheck="true">// To change its value, you could use `Update`</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">&quot;CreatedAt&quot;</span><span class="token operator">,</span> time<span class="token operator">.</span><span class="token function">Now<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">)</span>
</code></pre>
<h3 id="use-updatedat-used-to-store-records-updated-time">Use <code>UpdatedAt</code> used to store record&apos;s updated time</h3>
<p>Save records having <code>UpdatedAt</code> field will set it to current time.</p>
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Save<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span> <span class="token comment" spellcheck="true">// will set `UpdatedAt` to current time</span>
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&amp;</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">&quot;name&quot;</span><span class="token operator">,</span> <span class="token string">&quot;jinzhu&quot;</span><span class="token operator">)</span> <span class="token comment" spellcheck="true">// will set `UpdatedAt` to current time</span>
</code></pre>
<h3 id="use-deletedat-to-store-records-deleted-time-if-field-exists">Use <code>DeletedAt</code> to store record&apos;s deleted time if field exists</h3>
<p>Delete records having <code>DeletedAt</code> field, it won&apos;t delete the record from database, but will set field <code>DeletedAt</code>&apos;s value to current time.</p>
</section>
</div>
</div>
</div>
<a href="database.html" class="navigation navigation-prev " aria-label="Previous page: Migration">
<i class="fa fa-angle-left"></i>
</a>
<a href="models.html" class="navigation navigation-next " aria-label="Next page: Model Defination">
<i class="fa fa-angle-right"></i>
</a>
</div>
</div>
<script src="gitbook/app.js"></script>
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
<script src="gitbook/gitbook-plugin-search/search.js"></script>
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
<script src="gitbook/gitbook-plugin-livereload/plugin.js"></script>
<script>
require(["gitbook"], function(gitbook) {
gitbook.start({"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"fontsettings":{"family":"sans","size":2,"theme":"white"},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"livereload":{}});
});
</script>
</body>
</html>