gorm/index.html
2014-01-28 02:46:54 -08:00

1105 lines
106 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="chrome=1">
<title>Gorm by jinzhu</title>
<link rel="stylesheet" href="stylesheets/styles.css">
<link rel="stylesheet" href="stylesheets/pygment_trac.css">
<script src="javascripts/scale.fix.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
</head>
<body>
<div class="wrapper">
<header>
<h1 class="header">Gorm</h1>
<p class="header">The fantastic ORM library for Golang, aims to be developer friendly.</p>
<ul>
<li class="download"><a class="buttons" href="https://github.com/jinzhu/gorm/zipball/master">Download ZIP</a></li>
<li class="download"><a class="buttons" href="https://github.com/jinzhu/gorm/tarball/master">Download TAR</a></li>
<li><a class="buttons github" href="https://github.com/jinzhu/gorm">View On GitHub</a></li>
</ul>
<p class="header">This project is maintained by <a class="header name" href="https://github.com/jinzhu">jinzhu</a></p>
</header>
<section>
<h1>
<a name="gorm" class="anchor" href="#gorm"><span class="octicon octicon-link"></span></a>GORM</h1>
<p>The fantastic ORM library for Golang, aims to be developer friendly.</p>
<h2>
<a name="install" class="anchor" href="#install"><span class="octicon octicon-link"></span></a>Install</h2>
<pre><code>go get github.com/jinzhu/gorm
</code></pre>
<h2>
<a name="overview" class="anchor" href="#overview"><span class="octicon octicon-link"></span></a>Overview</h2>
<ul>
<li>Chainable API</li>
<li>Relations</li>
<li>Callbacks (before/after create/save/update/delete/find)</li>
<li>Soft Deletes</li>
<li>Auto Migrations</li>
<li>Transactions</li>
<li>Logger Support</li>
<li>Bind struct with tag</li>
<li>Iteration Support via <a href="#row--rows">Rows</a>
</li>
<li>Scopes</li>
<li>sql.Scanner support</li>
<li>Every feature comes with tests</li>
<li>Convention Over Configuration</li>
<li>Developer Friendly</li>
</ul><h2>
<a name="conventions" class="anchor" href="#conventions"><span class="octicon octicon-link"></span></a>Conventions</h2>
<ul>
<li>Table name is the plural of struct name's snake case.
Disable pluralization with <code>db.SingularTable(true)</code>, or <a href="#specify-table-name">specify your table name</a>
</li>
<li>Column name is the snake case of field's name.</li>
<li>Use <code>Id int64</code> field as primary key.</li>
<li>Use tag <code>sql</code> to change field's property, change the tag name with <code>db.SetTagIdentifier(new_name)</code>.</li>
<li>Use <code>CreatedAt</code> to store record's created time if field exists.</li>
<li>Use <code>UpdatedAt</code> to store record's updated time if field exists.</li>
<li>Use <code>DeletedAt</code> to store record's deleted time if field exists. <a href="#soft-delete">Soft Delete</a>
</li>
<li>Gorm uses reflection to know which tables to work with:</li>
</ul><div class="highlight highlight-go"><pre><span class="c1">// E.g Finding an existing User</span>
<span class="kd">var</span> <span class="nx">user</span> <span class="nx">User</span>
<span class="c1">// Gorm will now know to use table "users" ("user" if pluralisation has been disabled) for all operations.</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">// E.g creating a new User</span>
<span class="nx">DB</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"xxx"</span><span class="p">})</span> <span class="c1">// table "users"</span>
</pre></div>
<h1>
<a name="getting-started" class="anchor" href="#getting-started"><span class="octicon octicon-link"></span></a>Getting Started</h1>
<div class="highlight highlight-go"><pre><span class="kn">import</span> <span class="p">(</span>
<span class="s">"database/sql"</span>
<span class="s">"time"</span>
<span class="p">)</span>
<span class="kd">type</span> <span class="nx">User</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">Id</span> <span class="kt">int64</span>
<span class="nx">Birthday</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
<span class="nx">Age</span> <span class="kt">int64</span>
<span class="nx">Name</span> <span class="kt">string</span> <span class="s">`sql:"size:255"`</span>
<span class="nx">CreatedAt</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
<span class="nx">UpdatedAt</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
<span class="nx">DeletedAt</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
<span class="nx">Emails</span> <span class="p">[]</span><span class="nx">Email</span> <span class="c1">// Embedded structs</span>
<span class="nx">BillingAddress</span> <span class="nx">Address</span> <span class="c1">// Embedded struct</span>
<span class="nx">BillingAddressId</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullInt64</span> <span class="c1">// BillingAddress's foreign key</span>
<span class="nx">ShippingAddress</span> <span class="nx">Address</span> <span class="c1">// Another Embedded struct with same type</span>
<span class="nx">ShippingAddressId</span> <span class="kt">int64</span> <span class="c1">// ShippingAddress's foreign key</span>
<span class="nx">IgnoreMe</span> <span class="kt">int64</span> <span class="s">`sql:"-"`</span> <span class="c1">// Ignore this field</span>
<span class="p">}</span>
<span class="kd">type</span> <span class="nx">Email</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">Id</span> <span class="kt">int64</span>
<span class="nx">UserId</span> <span class="kt">int64</span> <span class="c1">// Foreign key for User</span>
<span class="nx">Email</span> <span class="kt">string</span> <span class="s">`sql:"type:varchar(100);"`</span> <span class="c1">// Set this field's type</span>
<span class="nx">Subscribed</span> <span class="kt">bool</span>
<span class="p">}</span>
<span class="kd">type</span> <span class="nx">Address</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">Id</span> <span class="kt">int64</span>
<span class="nx">Address1</span> <span class="kt">string</span> <span class="s">`sql:"not null;unique"`</span> <span class="c1">// Set this field as not nullable and unique in database</span>
<span class="nx">Address2</span> <span class="kt">string</span> <span class="s">`sql:"type:varchar(100);unique"`</span>
<span class="nx">Post</span> <span class="nx">sql</span><span class="p">.</span><span class="nx">NullString</span> <span class="s">`sql:not null`</span>
<span class="c1">// FYI, "NOT NULL" will only work well with NullXXX Scanner, because golang will initalize a default value for most type...</span>
<span class="p">}</span>
</pre></div>
<h2>
<a name="opening-a-database" class="anchor" href="#opening-a-database"><span class="octicon octicon-link"></span></a>Opening a Database</h2>
<div class="highlight highlight-go"><pre>
<span class="kn">import</span> <span class="s">"github.com/jinzhu/gorm"</span>
<span class="kn">import</span> <span class="nx">_</span> <span class="s">"github.com/lib/pq"</span>
<span class="c1">// import _ "github.com/go-sql-driver/mysql"</span>
<span class="c1">// import _ "github.com/mattn/go-sqlite3"</span>
<span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">Open</span><span class="p">(</span><span class="s">"postgres"</span><span class="p">,</span> <span class="s">"user=gorm dbname=gorm sslmode=disable"</span><span class="p">)</span>
<span class="c1">// db, err = Open("mysql", "gorm:gorm@/gorm?charset=utf8&amp;parseTime=True")</span>
<span class="c1">// db, err = Open("sqlite3", "/tmp/gorm.db")</span>
<span class="c1">// Get database connection handle [*sql.DB](http://golang.org/pkg/database/sql/#DB)</span>
<span class="nx">d</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">DB</span><span class="p">()</span>
<span class="c1">// With it you could use package `database/sql`'s builtin methods</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">DB</span><span class="p">().</span><span class="nx">SetMaxIdleConns</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">DB</span><span class="p">().</span><span class="nx">SetMaxOpenConns</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">DB</span><span class="p">().</span><span class="nx">Ping</span><span class="p">()</span>
<span class="c1">// By default, table name is plural of struct type, you can use struct type as table name with:</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">SingularTable</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
</pre></div>
<p>Gorm is goroutines friendly, so you can create a global variable to keep the connection and use it everywhere in your project.</p>
<div class="highlight highlight-go"><pre><span class="c1">// db.go</span>
<span class="kn">package</span> <span class="nx">db</span>
<span class="kn">import</span> <span class="p">(</span>
<span class="s">"fmt"</span>
<span class="s">"github.com/jinzhu/gorm"</span>
<span class="nx">_</span> <span class="s">"github.com/lib/pq"</span>
<span class="p">)</span>
<span class="kd">var</span> <span class="nx">DB</span> <span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span>
<span class="kd">func</span> <span class="nx">init</span><span class="p">()</span> <span class="p">{</span>
<span class="kd">var</span> <span class="nx">err</span> <span class="kt">error</span>
<span class="nx">DB</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">gorm</span><span class="p">.</span><span class="nx">Open</span><span class="p">(</span><span class="s">"postgres"</span><span class="p">,</span> <span class="s">"user=gorm dbname=gorm sslmode=disable"</span><span class="p">)</span>
<span class="c1">// Connection string parameters for Postgres - http://godoc.org/github.com/lib/pq, if you are using another</span>
<span class="c1">// database refer to the relevant driver's documentation.</span>
<span class="c1">// * dbname - The name of the database to connect to</span>
<span class="c1">// * user - The user to sign in as</span>
<span class="c1">// * password - The user's password</span>
<span class="c1">// * host - The host to connect to. Values that start with / are for unix domain sockets.</span>
<span class="c1">// (default is localhost)</span>
<span class="c1">// * port - The port to bind to. (default is 5432)</span>
<span class="c1">// * sslmode - Whether or not to use SSL (default is require, this is not the default for libpq)</span>
<span class="c1">// Valid SSL modes:</span>
<span class="c1">// * disable - No SSL</span>
<span class="c1">// * require - Always SSL (skip verification)</span>
<span class="c1">// * verify-full - Always SSL (require verification)</span>
<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
<span class="nb">panic</span><span class="p">(</span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Sprintf</span><span class="p">(</span><span class="s">"Got error when connect database, the error is '%v'"</span><span class="p">,</span> <span class="nx">err</span><span class="p">))</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// user.go</span>
<span class="kn">package</span> <span class="nx">user</span>
<span class="kn">import</span> <span class="p">.</span> <span class="s">"db"</span>
<span class="o">...</span>
<span class="nx">DB</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"xxx"</span><span class="p">})</span>
<span class="o">...</span>
</pre></div>
<h2>
<a name="struct--database-mapping" class="anchor" href="#struct--database-mapping"><span class="octicon octicon-link"></span></a>Struct &amp; Database Mapping</h2>
<div class="highlight highlight-go"><pre><span class="c1">// Create table from struct</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">CreateTable</span><span class="p">(</span><span class="nx">User</span><span class="p">{})</span>
<span class="c1">// Drop table</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">DropTable</span><span class="p">(</span><span class="nx">User</span><span class="p">{})</span>
</pre></div>
<h3>
<a name="automating-migrations" class="anchor" href="#automating-migrations"><span class="octicon octicon-link"></span></a>Automating Migrations</h3>
<p>Feel free to update your struct, AutoMigrate will keep your database update to date.</p>
<p>FYI, AutoMigrate will only add new columns, it won't change the current columns' types or delete unused columns, to make sure your data is safe.</p>
<p>If the table doesn't exist when AutoMigrate, gorm will run create the table automatically.
(the database first needs to be created manually though...).</p>
<p>(only postgres and mysql supported)</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">AutoMigrate</span><span class="p">(</span><span class="nx">User</span><span class="p">{})</span>
</pre></div>
<h1>
<a name="gorm-api" class="anchor" href="#gorm-api"><span class="octicon octicon-link"></span></a>Gorm API</h1>
<h2>
<a name="create" class="anchor" href="#create"><span class="octicon octicon-link"></span></a>Create</h2>
<div class="highlight highlight-go"><pre><span class="nx">user</span> <span class="o">:=</span> <span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="nx">Age</span><span class="p">:</span> <span class="mi">18</span><span class="p">,</span> <span class="nx">Birthday</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">()}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
</pre></div>
<h3>
<a name="newrecord" class="anchor" href="#newrecord"><span class="octicon octicon-link"></span></a>NewRecord</h3>
<p>Returns true if object hasnt been saved yet (<code>Id</code> is blank)</p>
<div class="highlight highlight-go"><pre><span class="nx">user</span> <span class="o">:=</span> <span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="nx">Age</span><span class="p">:</span> <span class="mi">18</span><span class="p">,</span> <span class="nx">Birthday</span><span class="p">:</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">()}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">NewRecord</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="c1">// =&gt; true</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">NewRecord</span><span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="c1">// =&gt; false</span>
</pre></div>
<h3>
<a name="create-with-substruct" class="anchor" href="#create-with-substruct"><span class="octicon octicon-link"></span></a>Create With SubStruct</h3>
<p>Refer to <a href="#query-with-related">Query With Related</a> for how to find associations</p>
<div class="highlight highlight-go"><pre><span class="nx">user</span> <span class="o">:=</span> <span class="nx">User</span><span class="p">{</span>
<span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">,</span>
<span class="nx">BillingAddress</span><span class="p">:</span> <span class="nx">Address</span><span class="p">{</span><span class="nx">Address1</span><span class="p">:</span> <span class="s">"Billing Address - Address 1"</span><span class="p">},</span>
<span class="nx">ShippingAddress</span><span class="p">:</span> <span class="nx">Address</span><span class="p">{</span><span class="nx">Address1</span><span class="p">:</span> <span class="s">"Shipping Address - Address 1"</span><span class="p">},</span>
<span class="nx">Emails</span><span class="p">:</span> <span class="p">[]</span><span class="nx">Email</span><span class="p">{{</span><span class="nx">Email</span><span class="p">:</span> <span class="s">"jinzhu@example.com"</span><span class="p">},</span> <span class="p">{</span><span class="nx">Email</span><span class="p">:</span> <span class="s">"jinzhu-2@example@example.com"</span><span class="p">}},</span>
<span class="p">}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// BEGIN TRANSACTION;</span>
<span class="c1">//// INSERT INTO "addresses" (address1) VALUES ("Billing Address - Address 1");</span>
<span class="c1">//// INSERT INTO "addresses" (address1) VALUES ("Shipping Address - Address 1");</span>
<span class="c1">//// INSERT INTO "users" (name,billing_address_id,shipping_address_id) VALUES ("jinzhu", 1, 2);</span>
<span class="c1">//// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu@example.com");</span>
<span class="c1">//// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu-2@example.com");</span>
<span class="c1">//// COMMIT;</span>
</pre></div>
<h2>
<a name="query" class="anchor" href="#query"><span class="octicon octicon-link"></span></a>Query</h2>
<div class="highlight highlight-go"><pre><span class="c1">// Get the first record</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users ORDER BY id LIMIT 1;</span>
<span class="c1">// Search table `users` is guessed from struct's type</span>
<span class="c1">// Get the last record</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Last</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users ORDER BY id DESC LIMIT 1;</span>
<span class="c1">// Get All records</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users;</span>
<span class="c1">// Get record with primary key</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE id = 10;</span>
</pre></div>
<h3>
<a name="query-with-where-sql" class="anchor" href="#query-with-where-sql"><span class="octicon octicon-link"></span></a>Query With Where (SQL)</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Get the first matched record</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;</span>
<span class="c1">// Get all matched records</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = 'jinzhu';</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name &lt;&gt; ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name &lt;&gt; 'jinzhu';</span>
<span class="c1">// IN</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name in (?)"</span><span class="p">,</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"jinzhu"</span><span class="p">,</span> <span class="s">"jinzhu 2"</span><span class="p">}).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name IN ('jinzhu', 'jinzhu 2');</span>
<span class="c1">// LIKE</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name LIKE ?"</span><span class="p">,</span> <span class="s">"%jin%"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name LIKE "%jin%";</span>
<span class="c1">// Multiple Conditions</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ? and age &gt;= ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="s">"22"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = 'jinzhu' AND age &gt;= 22;</span>
</pre></div>
<h3>
<a name="query-with-where-struct--map" class="anchor" href="#query-with-where-struct--map"><span class="octicon octicon-link"></span></a>Query With Where (Struct &amp; Map)</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Search with struct</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="nx">Age</span><span class="p">:</span> <span class="mi">20</span><span class="p">}).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;</span>
<span class="c1">// Search with map</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="s">"age"</span><span class="p">:</span> <span class="mi">20</span><span class="p">}).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;</span>
<span class="c1">// IN for primary Keys</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">([]</span><span class="kt">int64</span><span class="p">{</span><span class="mi">20</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">22</span><span class="p">}).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE id IN (20, 21, 22);</span>
</pre></div>
<h3>
<a name="query-with-not" class="anchor" href="#query-with-not"><span class="octicon octicon-link"></span></a>Query With Not</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Attribute Not Equal</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Not</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name &lt;&gt; "jinzhu" LIMIT 1;</span>
<span class="c1">// Not In</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Not</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">"jinzhu"</span><span class="p">,</span> <span class="s">"jinzhu 2"</span><span class="p">}).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");</span>
<span class="c1">// Not In for primary keys</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Not</span><span class="p">([]</span><span class="kt">int64</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">}).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE id NOT IN (1,2,3);</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Not</span><span class="p">([]</span><span class="kt">int64</span><span class="p">{}).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users;</span>
<span class="c1">// SQL string</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Not</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE NOT(name = "jinzhu");</span>
<span class="c1">// Not with struct</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Not</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">}).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name &lt;&gt; "jinzhu";</span>
</pre></div>
<h3>
<a name="query-with-inline-condition" class="anchor" href="#query-with-inline-condition"><span class="octicon octicon-link"></span></a>Query With Inline Condition</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Find with primary key</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="mi">23</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE id = 23 LIMIT 1;</span>
<span class="c1">// SQL string</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = "jinzhu";</span>
<span class="c1">// Multiple Conditions</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">,</span> <span class="s">"name &lt;&gt; ? and age &gt; ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name &lt;&gt; "jinzhu" AND age &gt; 20;</span>
<span class="c1">// Inline search with struct</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">,</span> <span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">20</span><span class="p">})</span>
<span class="c1">//// SELECT * FROM users WHERE age = 20;</span>
<span class="c1">// Inline search with map</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"age"</span><span class="p">:</span> <span class="mi">20</span><span class="p">})</span>
<span class="c1">//// SELECT * FROM users WHERE age = 20;</span>
</pre></div>
<h3>
<a name="query-with-or" class="anchor" href="#query-with-or"><span class="octicon octicon-link"></span></a>Query With Or</h3>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"role = ?"</span><span class="p">,</span> <span class="s">"admin"</span><span class="p">).</span><span class="nx">Or</span><span class="p">(</span><span class="s">"role = ?"</span><span class="p">,</span> <span class="s">"super_admin"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';</span>
<span class="c1">// Or With Struct</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = 'jinzhu'"</span><span class="p">).</span><span class="nx">Or</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu 2"</span><span class="p">}).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';</span>
<span class="c1">// Or With Map</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = 'jinzhu'"</span><span class="p">).</span><span class="nx">Or</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"jinzhu 2"</span><span class="p">}).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
</pre></div>
<h3>
<a name="query-with-related" class="anchor" href="#query-with-related"><span class="octicon octicon-link"></span></a>Query With Related</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Find user's emails with guessed foreign key</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">emails</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM emails WHERE user_id = 111;</span>
<span class="c1">// Find user's billing address with specified foreign key 'BillingAddressId'</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">address1</span><span class="p">,</span> <span class="s">"BillingAddressId"</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM addresses WHERE id = 123; // 123 is user's BillingAddressId</span>
<span class="c1">// Find user with guessed primary key value from email</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">email</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE id = 111; // 111 is email's UserId</span>
</pre></div>
<h3>
<a name="query-chains" class="anchor" href="#query-chains"><span class="octicon octicon-link"></span></a>Query Chains</h3>
<p>Gorm has a chainable API, so you could query like this</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name &lt;&gt; ?"</span><span class="p">,</span><span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"age &gt;= ? and role &lt;&gt; ?"</span><span class="p">,</span><span class="mi">20</span><span class="p">,</span><span class="s">"admin"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name &lt;&gt; 'jinzhu' AND age &gt;= 20 AND role &lt;&gt; 'admin';</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"role = ?"</span><span class="p">,</span> <span class="s">"admin"</span><span class="p">).</span><span class="nx">Or</span><span class="p">(</span><span class="s">"role = ?"</span><span class="p">,</span> <span class="s">"super_admin"</span><span class="p">).</span><span class="nx">Not</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
</pre></div>
<h2>
<a name="update" class="anchor" href="#update"><span class="octicon octicon-link"></span></a>Update</h2>
<h3>
<a name="update-an-existing-struct" class="anchor" href="#update-an-existing-struct"><span class="octicon octicon-link"></span></a>Update an existing struct</h3>
<div class="highlight highlight-go"><pre><span class="nx">user</span><span class="p">.</span><span class="nx">Name</span> <span class="p">=</span> <span class="s">"jinzhu 2"</span>
<span class="nx">user</span><span class="p">.</span><span class="nx">Age</span> <span class="p">=</span> <span class="mi">100</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// UPDATE users SET name='jinzhu 2', age=100, updated_at = '2013-11-17 21:34:10' WHERE id=111;</span>
</pre></div>
<h3>
<a name="update-one-attribute-with-update" class="anchor" href="#update-one-attribute-with-update"><span class="octicon octicon-link"></span></a>Update one attribute with <code>Update</code>
</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Update existing user's name if it is changed</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Update</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"hello"</span><span class="p">)</span>
<span class="c1">//// UPDATE users SET name='hello', updated_at = '2013-11-17 21:34:10' WHERE id=111;</span>
<span class="c1">// Find out a user, and update the name if it is changed</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="mi">111</span><span class="p">).</span><span class="nx">Update</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"hello"</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users LIMIT 1;</span>
<span class="c1">//// UPDATE users SET name='hello', updated_at = '2013-11-17 21:34:10' WHERE id=111;</span>
<span class="c1">// Update name with search condiation and specified table name</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"users"</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Update</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"hello"</span><span class="p">)</span>
<span class="c1">//// UPDATE users SET name='hello' WHERE id = 10;</span>
</pre></div>
<h3>
<a name="update-multiple-attributes-with-updates" class="anchor" href="#update-multiple-attributes-with-updates"><span class="octicon octicon-link"></span></a>Update multiple attributes with <code>Updates</code>
</h3>
<div class="highlight highlight-go"><pre><span class="c1">// Update user's name and age if they are changed</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Updates</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"hello"</span><span class="p">,</span> <span class="nx">Age</span><span class="p">:</span> <span class="mi">18</span><span class="p">})</span>
<span class="c1">//// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;</span>
<span class="c1">// Updates with Map</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"users"</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Updates</span><span class="p">(</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"hello"</span><span class="p">,</span> <span class="s">"age"</span><span class="p">:</span> <span class="mi">18</span><span class="p">})</span>
<span class="c1">//// UPDATE users SET name='hello', age=18 WHERE id = 10;</span>
<span class="c1">// Updates with Struct</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="nx">User</span><span class="p">{}).</span><span class="nx">Updates</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"hello"</span><span class="p">,</span> <span class="nx">Age</span><span class="p">:</span> <span class="mi">18</span><span class="p">})</span>
<span class="c1">//// UPDATE users SET name='hello', age=18;</span>
</pre></div>
<h3>
<a name="update-attributes-without-callbacks" class="anchor" href="#update-attributes-without-callbacks"><span class="octicon octicon-link"></span></a>Update attributes without callbacks</h3>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">UpdateColumn</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"hello"</span><span class="p">)</span>
<span class="c1">//// UPDATE users SET name='hello' WHERE id = 111;</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">UpdateColumns</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"hello"</span><span class="p">,</span> <span class="nx">Age</span><span class="p">:</span> <span class="mi">18</span><span class="p">})</span>
<span class="c1">//// UPDATE users SET name='hello', age=18 WHERE id = 111;</span>
</pre></div>
<h2>
<a name="delete" class="anchor" href="#delete"><span class="octicon octicon-link"></span></a>Delete</h2>
<h3>
<a name="delete-an-existing-struct" class="anchor" href="#delete-an-existing-struct"><span class="octicon octicon-link"></span></a>Delete an existing struct</h3>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Delete</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">email</span><span class="p">)</span>
<span class="c1">// DELETE from emails where id=10;</span>
</pre></div>
<h3>
<a name="batch-delete-with-search" class="anchor" href="#batch-delete-with-search"><span class="octicon octicon-link"></span></a>Batch Delete with search</h3>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"email LIKE ?"</span><span class="p">,</span> <span class="s">"%jinzhu%"</span><span class="p">).</span><span class="nx">Delete</span><span class="p">(</span><span class="nx">Email</span><span class="p">{})</span>
<span class="c1">// DELETE from emails where email LIKE "%jinhu%";</span>
</pre></div>
<h3>
<a name="soft-delete" class="anchor" href="#soft-delete"><span class="octicon octicon-link"></span></a>Soft Delete</h3>
<p>If a struct has a DeletedAt field, it will get soft delete ability automatically!</p>
<p>Structs that don't have a DeletedAt field will be deleted from the database permanently</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Delete</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;</span>
<span class="c1">// Delete with search condition</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"age = ?"</span><span class="p">,</span> <span class="mi">20</span><span class="p">).</span><span class="nx">Delete</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{})</span>
<span class="c1">//// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;</span>
<span class="c1">// Soft deleted records will be ignored when searched</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"age = 20"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE age = 100 AND (deleted_at IS NULL AND deleted_at &lt;= '0001-01-02');</span>
<span class="c1">// Find soft deleted records with Unscoped</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Unscoped</span><span class="p">().</span><span class="nx">Where</span><span class="p">(</span><span class="s">"age = 20"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE age = 20;</span>
<span class="c1">// Delete record permanently with Unscoped</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Unscoped</span><span class="p">().</span><span class="nx">Delete</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">order</span><span class="p">)</span>
<span class="c1">// DELETE FROM orders WHERE id=10;</span>
</pre></div>
<h2>
<a name="firstorinit" class="anchor" href="#firstorinit"><span class="octicon octicon-link"></span></a>FirstOrInit</h2>
<p>Try to get the first record, if failed, will initialize the struct with search conditions.</p>
<p>(only supports search conditions map and struct)</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"non_existing"</span><span class="p">})</span>
<span class="c1">//// User{Name: "non_existing"}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"Jinzhu"</span><span class="p">}).</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// User{Id: 111, Name: "Jinzhu", Age: 20}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">})</span>
<span class="c1">//// User{Id: 111, Name: "Jinzhu", Age: 20}</span>
</pre></div>
<h3>
<a name="firstorinit-with-attrs" class="anchor" href="#firstorinit-with-attrs"><span class="octicon octicon-link"></span></a>FirstOrInit With Attrs</h3>
<p>Ignore Attrs's arguments when searching, but use them to initialize the struct if no record is found.</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"non_existing"</span><span class="p">}).</span><span class="nx">Attrs</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">20</span><span class="p">}).</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM USERS WHERE name = 'non_existing';</span>
<span class="c1">//// User{Name: "non_existing", Age: 20}</span>
<span class="c1">// Or write it like this if has only one attribute</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"noexisting_user"</span><span class="p">}).</span><span class="nx">Attrs</span><span class="p">(</span><span class="s">"age"</span><span class="p">,</span> <span class="mi">20</span><span class="p">).</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">// If a record found, Attrs would be ignored</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"Jinzhu"</span><span class="p">}).</span><span class="nx">Attrs</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">30</span><span class="p">}).</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM USERS WHERE name = jinzhu';</span>
<span class="c1">//// User{Id: 111, Name: "Jinzhu", Age: 20}</span>
</pre></div>
<h3>
<a name="firstorinit-with-assign" class="anchor" href="#firstorinit-with-assign"><span class="octicon octicon-link"></span></a>FirstOrInit With Assign</h3>
<p>Ignore Assign's arguments when searching, but use them to fill the struct regardless, whether the record is found or not.</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"non_existing"</span><span class="p">}).</span><span class="nx">Assign</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">20</span><span class="p">}).</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// User{Name: "non_existing", Age: 20}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"Jinzhu"</span><span class="p">}).</span><span class="nx">Assign</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">30</span><span class="p">}).</span><span class="nx">FirstOrInit</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// User{Id: 111, Name: "Jinzhu", Age: 30}</span>
</pre></div>
<h2>
<a name="firstorcreate" class="anchor" href="#firstorcreate"><span class="octicon octicon-link"></span></a>FirstOrCreate</h2>
<p>Try to get the first record, if failed, will initialize the struct with the search conditions and insert it in the database.</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"non_existing"</span><span class="p">})</span>
<span class="c1">//// User{Id: 112, Name: "non_existing"}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"Jinzhu"</span><span class="p">}).</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// User{Id: 111, Name: "Jinzhu"}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span><span class="s">"name"</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">,</span> <span class="s">"age"</span><span class="p">:</span> <span class="mi">30</span><span class="p">})</span>
<span class="c1">//// user -&gt; User{Id: 111, Name: "jinzhu", Age: 20}</span>
</pre></div>
<h3>
<a name="firstorcreate-with-attrs" class="anchor" href="#firstorcreate-with-attrs"><span class="octicon octicon-link"></span></a>FirstOrCreate With Attrs</h3>
<p>Ignore Attrs's arguments when searching, but use them to initialize the struct if no record is found.</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"non_existing"</span><span class="p">}).</span><span class="nx">Attrs</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">20</span><span class="p">}).</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = 'non_existing';</span>
<span class="c1">//// User{Id: 112, Name: "non_existing", Age: 20}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">}).</span><span class="nx">Attrs</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">30</span><span class="p">}).</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// User{Id: 111, Name: "jinzhu", Age: 20}</span>
</pre></div>
<h3>
<a name="firstorcreate-with-assign" class="anchor" href="#firstorcreate-with-assign"><span class="octicon octicon-link"></span></a>FirstOrCreate With Assign</h3>
<p>Ignore Assign's arguments when searching, but use them to fill the struct regardless, whether the record is found or not, then save it back to the database.</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"non_existing"</span><span class="p">}).</span><span class="nx">Assign</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">20</span><span class="p">}).</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// user -&gt; User{Id: 112, Name: "non_existing", Age: 20}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"jinzhu"</span><span class="p">}).</span><span class="nx">Assign</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">Age</span><span class="p">:</span> <span class="mi">30</span><span class="p">}).</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE name = 'jinzhu';</span>
<span class="c1">//// UPDATE users SET age=30 WHERE id = 111;</span>
<span class="c1">//// User{Id: 111, Name: "jinzhu", Age: 30}</span>
</pre></div>
<h2>
<a name="select" class="anchor" href="#select"><span class="octicon octicon-link"></span></a>Select</h2>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Select</span><span class="p">(</span><span class="s">"name, age"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT name, age FROM users;</span>
</pre></div>
<h2>
<a name="order" class="anchor" href="#order"><span class="octicon octicon-link"></span></a>Order</h2>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Order</span><span class="p">(</span><span class="s">"age desc, name"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users ORDER BY age desc, name;</span>
<span class="c1">// Multiple orders</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Order</span><span class="p">(</span><span class="s">"age desc"</span><span class="p">).</span><span class="nx">Order</span><span class="p">(</span><span class="s">"name"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users ORDER BY age desc, name;</span>
<span class="c1">// ReOrder</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Order</span><span class="p">(</span><span class="s">"age desc"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users1</span><span class="p">).</span><span class="nx">Order</span><span class="p">(</span><span class="s">"age"</span><span class="p">,</span> <span class="kc">true</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users2</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users ORDER BY age desc; (users1)</span>
<span class="c1">//// SELECT * FROM users ORDER BY age; (users2)</span>
</pre></div>
<h2>
<a name="limit" class="anchor" href="#limit"><span class="octicon octicon-link"></span></a>Limit</h2>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Limit</span><span class="p">(</span><span class="mi">3</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users LIMIT 3;</span>
<span class="c1">// Remove limit with -1</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Limit</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users1</span><span class="p">).</span><span class="nx">Limit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users2</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users LIMIT 10; (users1)</span>
<span class="c1">//// SELECT * FROM users; (users2)</span>
</pre></div>
<h2>
<a name="offset" class="anchor" href="#offset"><span class="octicon octicon-link"></span></a>Offset</h2>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Offset</span><span class="p">(</span><span class="mi">3</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users OFFSET 3;</span>
<span class="c1">// Remove offset with -1</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Offset</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users1</span><span class="p">).</span><span class="nx">Offset</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users2</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users OFFSET 10; (users1)</span>
<span class="c1">//// SELECT * FROM users; (users2)</span>
</pre></div>
<h2>
<a name="count" class="anchor" href="#count"><span class="octicon octicon-link"></span></a>Count</h2>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Or</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu 2"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">).</span><span class="nx">Count</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">count</span><span class="p">)</span>
<span class="c1">//// SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)</span>
<span class="c1">//// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)</span>
<span class="c1">// Set table name with Model</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="nx">User</span><span class="p">{}).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Count</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">count</span><span class="p">)</span>
<span class="c1">//// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)</span>
<span class="c1">// Set table name with Table</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"deleted_users"</span><span class="p">).</span><span class="nx">Count</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">count</span><span class="p">)</span>
<span class="c1">//// SELECT count(*) FROM deleted_users;</span>
</pre></div>
<h2>
<a name="pluck" class="anchor" href="#pluck"><span class="octicon octicon-link"></span></a>Pluck</h2>
<p>Get struct's selected attributes as a map</p>
<div class="highlight highlight-go"><pre><span class="kd">var</span> <span class="nx">ages</span> <span class="p">[]</span><span class="kt">int64</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">).</span><span class="nx">Pluck</span><span class="p">(</span><span class="s">"age"</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">ages</span><span class="p">)</span>
<span class="c1">// Set Table With Model</span>
<span class="kd">var</span> <span class="nx">names</span> <span class="p">[]</span><span class="kt">string</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{}).</span><span class="nx">Pluck</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">names</span><span class="p">)</span>
<span class="c1">//// SELECT name FROM users;</span>
<span class="c1">// Set Table With Table</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"deleted_users"</span><span class="p">).</span><span class="nx">Pluck</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">names</span><span class="p">)</span>
<span class="c1">//// SELECT name FROM deleted_users;</span>
<span class="c1">// Plucking more than one column? Do it like this:</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Select</span><span class="p">(</span><span class="s">"name, age"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
</pre></div>
<h2>
<a name="transactions" class="anchor" href="#transactions"><span class="octicon octicon-link"></span></a>Transactions</h2>
<p>All individual save and delete operations are run in a transaction by default.</p>
<div class="highlight highlight-go"><pre><span class="nx">tx</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Begin</span><span class="p">()</span>
<span class="nx">user</span> <span class="o">:=</span> <span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span> <span class="s">"transcation"</span><span class="p">}</span>
<span class="nx">tx</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">u</span><span class="p">)</span>
<span class="nx">tx</span><span class="p">.</span><span class="nx">Update</span><span class="p">(</span><span class="s">"age"</span><span class="p">:</span> <span class="mi">90</span><span class="p">)</span>
<span class="c1">// do whatever</span>
<span class="c1">// rollback</span>
<span class="nx">tx</span><span class="p">.</span><span class="nx">Rollback</span><span class="p">()</span>
<span class="c1">// commit</span>
<span class="nx">tx</span><span class="p">.</span><span class="nx">Commit</span><span class="p">()</span>
</pre></div>
<h2>
<a name="callbacks" class="anchor" href="#callbacks"><span class="octicon octicon-link"></span></a>Callbacks</h2>
<p>Callbacks are methods defined on the struct's pointer.
If any callback returns an error, gorm will stop future operations and rollback all changes.</p>
<p>Here is a list of all available callbacks,
listed in the same order in which they will get called during the respective operations.</p>
<h3>
<a name="creating-an-object" class="anchor" href="#creating-an-object"><span class="octicon octicon-link"></span></a>Creating an Object</h3>
<div class="highlight highlight-go"><pre><span class="nx">BeforeSave</span>
<span class="nx">BeforeCreate</span>
<span class="c1">// save before associations</span>
<span class="c1">// save self</span>
<span class="c1">// save after associations</span>
<span class="nx">AfterCreate</span>
<span class="nx">AfterSave</span>
</pre></div>
<h3>
<a name="updating-an-object" class="anchor" href="#updating-an-object"><span class="octicon octicon-link"></span></a>Updating an Object</h3>
<div class="highlight highlight-go"><pre><span class="nx">BeforeSave</span>
<span class="nx">BeforeUpdate</span>
<span class="c1">// save before associations</span>
<span class="c1">// save self</span>
<span class="c1">// save after associations</span>
<span class="nx">AfterUpdate</span>
<span class="nx">AfterSave</span>
</pre></div>
<h3>
<a name="destroying-an-object" class="anchor" href="#destroying-an-object"><span class="octicon octicon-link"></span></a>Destroying an Object</h3>
<div class="highlight highlight-go"><pre><span class="nx">BeforeDelete</span>
<span class="c1">// delete self</span>
<span class="nx">AfterDelete</span>
</pre></div>
<h3>
<a name="after-find" class="anchor" href="#after-find"><span class="octicon octicon-link"></span></a>After Find</h3>
<div class="highlight highlight-go"><pre><span class="c1">// load record/records from database</span>
<span class="nx">AfterFind</span>
</pre></div>
<p>Here is an example:</p>
<div class="highlight highlight-go"><pre><span class="kd">func</span> <span class="p">(</span><span class="nx">u</span> <span class="o">*</span><span class="nx">User</span><span class="p">)</span> <span class="nx">BeforeUpdate</span><span class="p">()</span> <span class="p">(</span><span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="nx">u</span><span class="p">.</span><span class="nx">readonly</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">err</span> <span class="p">=</span> <span class="nx">errors</span><span class="p">.</span><span class="nx">New</span><span class="p">(</span><span class="s">"Read Only User!"</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span>
<span class="p">}</span>
<span class="c1">// Rollback the insertion if there are more than 1000 users (hypothetical example)</span>
<span class="kd">func</span> <span class="p">(</span><span class="nx">u</span> <span class="o">*</span><span class="nx">User</span><span class="p">)</span> <span class="nx">AfterCreate</span><span class="p">()</span> <span class="p">(</span><span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">u</span><span class="p">.</span><span class="nx">Id</span> <span class="p">&gt;</span> <span class="mi">1000</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// Just as an example, don't use Id to count users!</span>
<span class="nx">err</span> <span class="p">=</span> <span class="nx">errors</span><span class="p">.</span><span class="nx">New</span><span class="p">(</span><span class="s">"Only 1000 users allowed!"</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span>
<span class="p">}</span>
</pre></div>
<div class="highlight highlight-go"><pre><span class="c1">// As you know, the save/delete operations are running in a transaction</span>
<span class="c1">// This is means that all your changes will be rolled back if there are any errors</span>
<span class="c1">// If you want your changes in callbacks be run in the same transaction</span>
<span class="c1">// you have to pass the transaction as argument to the function</span>
<span class="kd">func</span> <span class="p">(</span><span class="nx">u</span> <span class="o">*</span><span class="nx">User</span><span class="p">)</span> <span class="nx">AfterCreate</span><span class="p">(</span><span class="nx">tx</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="p">(</span><span class="nx">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">tx</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="nx">u</span><span class="p">).</span><span class="nx">Update</span><span class="p">(</span><span class="s">"role"</span><span class="p">,</span> <span class="s">"admin"</span><span class="p">)</span>
<span class="k">return</span>
<span class="p">}</span>
</pre></div>
<h2>
<a name="specifying-the-table-name" class="anchor" href="#specifying-the-table-name"><span class="octicon octicon-link"></span></a>Specifying the Table Name</h2>
<div class="highlight highlight-go"><pre><span class="c1">// Create `deleted_users` table with User's fields</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"deleted_users"</span><span class="p">).</span><span class="nx">CreateTable</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{})</span>
<span class="c1">// Search from table `deleted_users`</span>
<span class="kd">var</span> <span class="nx">deleted_users</span> <span class="p">[]</span><span class="nx">User</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"deleted_users"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">deleted_users</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM deleted_users;</span>
<span class="c1">// Delete results from table `deleted_users` with search conditions</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"deleted_users"</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Delete</span><span class="p">()</span>
<span class="c1">//// DELETE FROM deleted_users WHERE name = 'jinzhu';</span>
</pre></div>
<h3>
<a name="specifying-the-table-name-for-struct-permanently-with-tablename" class="anchor" href="#specifying-the-table-name-for-struct-permanently-with-tablename"><span class="octicon octicon-link"></span></a>Specifying the Table Name for Struct permanently with TableName</h3>
<div class="highlight highlight-go"><pre><span class="kd">type</span> <span class="nx">Cart</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="p">}</span>
<span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="nx">Cart</span><span class="p">)</span> <span class="nx">TableName</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
<span class="k">return</span> <span class="s">"shopping_cart"</span>
<span class="p">}</span>
<span class="kd">func</span> <span class="p">(</span><span class="nx">u</span> <span class="nx">User</span><span class="p">)</span> <span class="nx">TableName</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
<span class="k">if</span> <span class="nx">u</span><span class="p">.</span><span class="nx">Role</span> <span class="o">==</span> <span class="s">"admin"</span> <span class="p">{</span>
<span class="k">return</span> <span class="s">"admin_users"</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">return</span> <span class="s">"users"</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
<h2>
<a name="scopes" class="anchor" href="#scopes"><span class="octicon octicon-link"></span></a>Scopes</h2>
<div class="highlight highlight-go"><pre><span class="kd">func</span> <span class="nx">AmountGreaterThan1000</span><span class="p">(</span><span class="nx">d</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span> <span class="p">{</span>
<span class="nx">d</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"amount &gt; ?"</span><span class="p">,</span> <span class="mi">1000</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">func</span> <span class="nx">PaidWithCreditCard</span><span class="p">(</span><span class="nx">d</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span> <span class="p">{</span>
<span class="nx">d</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"pay_mode_sign = ?"</span><span class="p">,</span> <span class="s">"C"</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">func</span> <span class="nx">PaidWithCod</span><span class="p">(</span><span class="nx">d</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span> <span class="p">{</span>
<span class="nx">d</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"pay_mode_sign = ?"</span><span class="p">,</span> <span class="s">"C"</span><span class="p">)</span>
<span class="p">}</span>
<span class="kd">func</span> <span class="nx">OrderStatus</span><span class="p">(</span><span class="nx">status</span> <span class="p">[]</span><span class="kt">string</span><span class="p">)</span> <span class="kd">func</span> <span class="p">(</span><span class="nx">d</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span> <span class="p">{</span>
<span class="k">return</span> <span class="kd">func</span> <span class="p">(</span><span class="nx">d</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span><span class="p">)</span> <span class="o">*</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">DB</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">d</span><span class="p">.</span><span class="nx">Scopes</span><span class="p">(</span><span class="nx">AmountGreaterThan1000</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"status in (?)"</span><span class="p">,</span> <span class="nx">status</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Scopes</span><span class="p">(</span><span class="nx">AmountGreaterThan1000</span><span class="p">,</span> <span class="nx">PaidWithCreditCard</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">orders</span><span class="p">)</span>
<span class="c1">// Find all credit card orders and amount greater than 1000</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Scopes</span><span class="p">(</span><span class="nx">AmountGreaterThan1000</span><span class="p">,</span> <span class="nx">PaidWithCod</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">orders</span><span class="p">)</span>
<span class="c1">// Find all COD orders and amount greater than 1000</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Scopes</span><span class="p">(</span><span class="nx">OrderStatus</span><span class="p">([]</span><span class="kt">string</span><span class="p">{</span><span class="s">"paid"</span><span class="p">,</span> <span class="s">"shipped"</span><span class="p">})).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">orders</span><span class="p">)</span>
<span class="c1">// Find all paid, shipped orders and amount greater than 1000</span>
</pre></div>
<h2>
<a name="logger" class="anchor" href="#logger"><span class="octicon octicon-link"></span></a>Logger</h2>
<p>Gorm has built-in logger support, enable it with:</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">LogMode</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span>
</pre></div>
<p><img src="https://raw.github.com/jinzhu/gorm/master/images/logger.png" alt="logger"></p>
<div class="highlight highlight-go"><pre><span class="c1">// Use your own logger</span>
<span class="c1">// Refer to gorm's default logger for how to format messages: https://github.com/jinzhu/gorm/blob/master/logger.go#files</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">SetLogger</span><span class="p">(</span><span class="nx">log</span><span class="p">.</span><span class="nx">New</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span> <span class="s">"\r\n"</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
<span class="c1">// If you want to use gorm's default log format, then you could just do it like this</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">SetLogger</span><span class="p">(</span><span class="nx">gorm</span><span class="p">.</span><span class="nx">Logger</span><span class="p">{</span><span class="nx">revel</span><span class="p">.</span><span class="nx">TRACE</span><span class="p">})</span>
<span class="c1">// Disable logging</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">LogMode</span><span class="p">(</span><span class="kc">false</span><span class="p">)</span>
<span class="c1">// Enable logging for a single operation, to make debugging easy</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Debug</span><span class="p">().</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{})</span>
</pre></div>
<h2>
<a name="row--rows" class="anchor" href="#row--rows"><span class="octicon octicon-link"></span></a>Row &amp; Rows</h2>
<p>Row &amp; Rows is not chainable, it works just like <code>QueryRow</code> and <code>Query</code></p>
<div class="highlight highlight-go"><pre><span class="nx">row</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"users"</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="k">select</span><span class="p">(</span><span class="s">"name, age"</span><span class="p">).</span><span class="nx">Row</span><span class="p">()</span> <span class="c1">// (*sql.Row)</span>
<span class="nx">row</span><span class="p">.</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">age</span><span class="p">)</span>
<span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="nx">User</span><span class="p">{}).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="k">select</span><span class="p">(</span><span class="s">"name, age, email"</span><span class="p">).</span><span class="nx">Rows</span><span class="p">()</span> <span class="c1">// (*sql.Rows, error)</span>
<span class="k">defer</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Close</span><span class="p">()</span>
<span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Next</span><span class="p">()</span> <span class="p">{</span>
<span class="o">...</span>
<span class="nx">rows</span><span class="p">.</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">age</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">email</span><span class="p">)</span>
<span class="o">...</span>
<span class="p">}</span>
<span class="c1">// Rows() with raw sql</span>
<span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Raw</span><span class="p">(</span><span class="s">"select name, age, email from users where name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">Rows</span><span class="p">()</span> <span class="c1">// (*sql.Rows, error)</span>
<span class="k">defer</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Close</span><span class="p">()</span>
<span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Next</span><span class="p">()</span> <span class="p">{</span>
<span class="o">...</span>
<span class="nx">rows</span><span class="p">.</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">name</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">age</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">email</span><span class="p">)</span>
<span class="o">...</span>
<span class="p">}</span>
</pre></div>
<h2>
<a name="scan" class="anchor" href="#scan"><span class="octicon octicon-link"></span></a>Scan</h2>
<p>Scan sql results into strcut</p>
<div class="highlight highlight-go"><pre><span class="kd">type</span> <span class="nx">Result</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">Name</span> <span class="kt">string</span>
<span class="nx">Age</span> <span class="kt">int</span>
<span class="p">}</span>
<span class="kd">var</span> <span class="nx">result</span> <span class="nx">Result</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"users"</span><span class="p">).</span><span class="nx">Select</span><span class="p">(</span><span class="s">"name, age"</span><span class="p">).</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="mi">3</span><span class="p">).</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">result</span><span class="p">)</span>
<span class="c1">// Scan raw sql</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Raw</span><span class="p">(</span><span class="s">"SELECT name, age FROM users WHERE name = ?"</span><span class="p">,</span> <span class="mi">3</span><span class="p">).</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">result</span><span class="p">)</span>
</pre></div>
<h2>
<a name="group--having" class="anchor" href="#group--having"><span class="octicon octicon-link"></span></a>Group &amp; Having</h2>
<div class="highlight highlight-go"><pre><span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"orders"</span><span class="p">).</span><span class="nx">Select</span><span class="p">(</span><span class="s">"date(created_at) as date, sum(amount) as total"</span><span class="p">).</span><span class="nx">Group</span><span class="p">(</span><span class="s">"date(created_at)"</span><span class="p">).</span><span class="nx">Rows</span><span class="p">()</span>
<span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Next</span><span class="p">()</span> <span class="p">{</span>
<span class="o">...</span>
<span class="p">}</span>
<span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"orders"</span><span class="p">).</span><span class="nx">Select</span><span class="p">(</span><span class="s">"date(created_at) as date, sum(amount) as total"</span><span class="p">).</span><span class="nx">Group</span><span class="p">(</span><span class="s">"date(created_at)"</span><span class="p">).</span><span class="nx">Having</span><span class="p">(</span><span class="s">"sum(amount) &gt; ?"</span><span class="p">,</span> <span class="mi">100</span><span class="p">).</span><span class="nx">Rows</span><span class="p">()</span>
<span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Next</span><span class="p">()</span> <span class="p">{</span>
<span class="o">...</span>
<span class="p">}</span>
<span class="kd">type</span> <span class="nx">Result</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">Date</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
<span class="nx">Total</span> <span class="kt">int64</span>
<span class="p">}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"orders"</span><span class="p">).</span><span class="nx">Select</span><span class="p">(</span><span class="s">"date(created_at) as date, sum(amount) as total"</span><span class="p">).</span><span class="nx">Group</span><span class="p">(</span><span class="s">"date(created_at)"</span><span class="p">).</span><span class="nx">Having</span><span class="p">(</span><span class="s">"sum(amount) &gt; ?"</span><span class="p">,</span> <span class="mi">100</span><span class="p">).</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">results</span><span class="p">)</span>
</pre></div>
<h2>
<a name="joins" class="anchor" href="#joins"><span class="octicon octicon-link"></span></a>Joins</h2>
<div class="highlight highlight-go"><pre><span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"users"</span><span class="p">).</span><span class="nx">Select</span><span class="p">(</span><span class="s">"users.name, emails.email"</span><span class="p">).</span><span class="nx">Joins</span><span class="p">(</span><span class="s">"left join emails on emails.user_id = users.id"</span><span class="p">).</span><span class="nx">Rows</span><span class="p">()</span>
<span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nx">Next</span><span class="p">()</span> <span class="p">{</span>
<span class="o">...</span>
<span class="p">}</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Table</span><span class="p">(</span><span class="s">"users"</span><span class="p">).</span><span class="nx">Select</span><span class="p">(</span><span class="s">"users.name, emails.email"</span><span class="p">).</span><span class="nx">Joins</span><span class="p">(</span><span class="s">"left join emails on emails.user_id = users.id"</span><span class="p">).</span><span class="nx">Scan</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">results</span><span class="p">)</span>
</pre></div>
<h2>
<a name="run-raw-sql" class="anchor" href="#run-raw-sql"><span class="octicon octicon-link"></span></a>Run Raw SQL</h2>
<div class="highlight highlight-go"><pre><span class="c1">// Raw SQL</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Exec</span><span class="p">(</span><span class="s">"DROP TABLE users;"</span><span class="p">)</span>
<span class="c1">// Raw SQL with arguments</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Exec</span><span class="p">(</span><span class="s">"UPDATE orders SET shipped_at=? WHERE id IN (?)"</span><span class="p">,</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">,</span> <span class="p">[]</span><span class="kt">int64</span><span class="p">{</span><span class="mi">11</span><span class="p">,</span><span class="mi">22</span><span class="p">,</span><span class="mi">33</span><span class="p">})</span>
</pre></div>
<h2>
<a name="error-handling" class="anchor" href="#error-handling"><span class="octicon octicon-link"></span></a>Error Handling</h2>
<div class="highlight highlight-go"><pre><span class="nx">query</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="nx">query</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Limit</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users</span><span class="p">)</span>
<span class="c1">//// query.Error returns the last error</span>
<span class="c1">//// query.Errors returns all errors that have taken place</span>
<span class="c1">//// If an error has taken place, gorm will stop all following operations</span>
<span class="c1">// I often use some code like below to do error handling when writing applications</span>
<span class="k">if</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"jinzhu"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Error</span><span class="p">;</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">}</span>
<span class="c1">// If no record is found, gorm will return RecordNotFound error, you could check it with</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"hello world"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">User</span><span class="p">{}).</span><span class="nx">Error</span> <span class="o">==</span> <span class="nx">gorm</span><span class="p">.</span><span class="nx">RecordNotFound</span>
<span class="c1">// Or use shortcut method</span>
<span class="k">if</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"name = ?"</span><span class="p">,</span> <span class="s">"hello world"</span><span class="p">).</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">RecordNotFound</span><span class="p">()</span> <span class="p">{</span>
<span class="nb">panic</span><span class="p">(</span><span class="s">"no record found"</span><span class="p">)</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">user</span><span class="p">.</span><span class="nx">Blalala</span><span class="p">()</span>
<span class="p">}</span>
<span class="k">if</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Model</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">credit_card</span><span class="p">).</span><span class="nx">RecordNotFound</span><span class="p">()</span> <span class="p">{</span>
<span class="nb">panic</span><span class="p">(</span><span class="s">"no credit card found"</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
<h2>
<a name="advanced-usage-with-query-chaining" class="anchor" href="#advanced-usage-with-query-chaining"><span class="octicon octicon-link"></span></a>Advanced Usage With Query Chaining</h2>
<p>Already excited with what gorm has to offer? Let's see some magic!</p>
<div class="highlight highlight-go"><pre><span class="nx">db</span><span class="p">.</span><span class="nx">First</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">first_article</span><span class="p">).</span><span class="nx">Count</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">total_count</span><span class="p">).</span><span class="nx">Limit</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">first_page_articles</span><span class="p">).</span><span class="nx">Offset</span><span class="p">(</span><span class="mi">10</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">second_page_articles</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM articles LIMIT 1; (first_article)</span>
<span class="c1">//// SELECT count(*) FROM articles; (total_count)</span>
<span class="c1">//// SELECT * FROM articles LIMIT 10; (first_page_articles)</span>
<span class="c1">//// SELECT * FROM articles LIMIT 10 OFFSET 10; (second_page_articles)</span>
<span class="c1">// Mix where conditions with inline conditions</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"created_at &gt; ?"</span><span class="p">,</span> <span class="s">"2013-10-10"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">cancelled_orders</span><span class="p">,</span> <span class="s">"state = ?"</span><span class="p">,</span> <span class="s">"cancelled"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">shipped_orders</span><span class="p">,</span> <span class="s">"state = ?"</span><span class="p">,</span> <span class="s">"shipped"</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM orders WHERE created_at &gt; '2013/10/10' AND state = 'cancelled'; (cancelled_orders)</span>
<span class="c1">//// SELECT * FROM orders WHERE created_at &gt; '2013/10/10' AND state = 'shipped'; (shipped_orders)</span>
<span class="c1">// Use variables to keep query chain</span>
<span class="nx">todays_orders</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"created_at &gt; ?"</span><span class="p">,</span> <span class="s">"2013-10-29"</span><span class="p">)</span>
<span class="nx">cancelled_orders</span> <span class="o">:=</span> <span class="nx">todays_orders</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"state = ?"</span><span class="p">,</span> <span class="s">"cancelled"</span><span class="p">)</span>
<span class="nx">shipped_orders</span> <span class="o">:=</span> <span class="nx">todays_orders</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"state = ?"</span><span class="p">,</span> <span class="s">"shipped"</span><span class="p">)</span>
<span class="c1">// Search with shared conditions from different tables</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"product_name = ?"</span><span class="p">,</span> <span class="s">"fancy_product"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">orders</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">shopping_carts</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM orders WHERE product_name = 'fancy_product'; (orders)</span>
<span class="c1">//// SELECT * FROM carts WHERE product_name = 'fancy_product'; (shopping_carts)</span>
<span class="c1">// Search with shared conditions from different tables with specified table</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"mail_type = ?"</span><span class="p">,</span> <span class="s">"TEXT"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users1</span><span class="p">).</span><span class="nx">Table</span><span class="p">(</span><span class="s">"deleted_users"</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">users2</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE mail_type = 'TEXT'; (users1)</span>
<span class="c1">//// SELECT * FROM deleted_users WHERE mail_type = 'TEXT'; (users2)</span>
<span class="c1">// An example on how to use FirstOrCreate</span>
<span class="nx">db</span><span class="p">.</span><span class="nx">Where</span><span class="p">(</span><span class="s">"email = ?"</span><span class="p">,</span> <span class="s">"x@example.org"</span><span class="p">).</span><span class="nx">Attrs</span><span class="p">(</span><span class="nx">User</span><span class="p">{</span><span class="nx">RegisteredIp</span><span class="p">:</span> <span class="s">"111.111.111.111"</span><span class="p">}).</span><span class="nx">FirstOrCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">user</span><span class="p">)</span>
<span class="c1">//// SELECT * FROM users WHERE email = 'x@example.org';</span>
<span class="c1">//// INSERT INTO "users" (email,registered_ip) VALUES ("x@example.org", "111.111.111.111") // if no record found</span>
</pre></div>
<h2>
<a name="todo" class="anchor" href="#todo"><span class="octicon octicon-link"></span></a>TODO</h2>
<ul>
<li>
<p>Support plugin
BeforeQuery
BeforeSave
BeforeCreate
BeforeUpdate
BeforeDelete
AfterQuery
AfterSave
AfterCreate
AfterUpdate
SoftDelete
BeforeQuery
BeforeSave
BeforeDelete</p>
<p>db.RegisterPlugin("xxx")
db.RegisterCallback("BeforeQuery", func() {})
db.RegisterCallback("BeforeSave", func() {})
db.RegisterFuncation("Search", func() {})
db.Model(&amp;[]User{}).Limit(10).Do("Search", "vip", "china")
db.Mode(&amp;User{}).Do("EditForm").Get("edit_form_html")</p>
<p>DefaultValue, DefaultTimeZone, R/W Splitting, Validation</p>
</li>
<li>Getter/Setter
share or not? transaction?</li>
<li>Github Pages</li>
<li>Includes</li>
<li>AlertColumn, DropColumn, AddIndex, RemoveIndex</li>
</ul><h1>
<a name="author" class="anchor" href="#author"><span class="octicon octicon-link"></span></a>Author</h1>
<p><strong>jinzhu</strong></p>
<ul>
<li><a href="http://github.com/jinzhu">http://github.com/jinzhu</a></li>
<li><a href="mailto:wosmvp@gmail.com">wosmvp@gmail.com</a></li>
<li><a href="http://twitter.com/zhangjinzhu">http://twitter.com/zhangjinzhu</a></li>
</ul><h2>
<a name="license" class="anchor" href="#license"><span class="octicon octicon-link"></span></a>License</h2>
<p>Released under the <a href="http://www.opensource.org/licenses/MIT">MIT License</a>.</p>
<p><a href="http://godoc.org/github.com/jinzhu/gorm"><img src="https://godoc.org/github.com/jinzhu/gorm?status.png" alt="GoDoc"></a></p>
</section>
<footer>
<p><small>Hosted on <a href="http://pages.github.com">GitHub Pages</a> using the Dinky theme</small></p>
</footer>
</div>
<!--[if !IE]><script>fixScale(document);</script><![endif]-->
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-23459165-4");
pageTracker._trackPageview();
} catch(err) {}
</script>
</body>
</html>