1105 lines
106 KiB
HTML
1105 lines
106 KiB
HTML
<!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">&</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">&</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&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">&</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 & 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">&</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 hasn’t 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">// => true</span>
|
||
|
||
<span class="nx">db</span><span class="p">.</span><span class="nx">Save</span><span class="p">(</span><span class="o">&</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">// => 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">&</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">&</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">&</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">&</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">&</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">&</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">&</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 <> ?"</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">&</span><span class="nx">users</span><span class="p">)</span>
|
||
<span class="c1">//// SELECT * FROM users WHERE name <> '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">&</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">&</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 >= ?"</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">&</span><span class="nx">users</span><span class="p">)</span>
|
||
<span class="c1">//// SELECT * FROM users WHERE name = 'jinzhu' AND age >= 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 & 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">&</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">&</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">&</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">&</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">&</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">// 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">&</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">&</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">&</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">&</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">&</span><span class="nx">user</span><span class="p">)</span>
|
||
<span class="c1">//// SELECT * FROM users WHERE name <> "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">&</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">&</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">&</span><span class="nx">users</span><span class="p">,</span> <span class="s">"name <> ? and age > ?"</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 <> "jinzhu" AND age > 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">&</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">&</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">&</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">&</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">&</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">&</span><span class="nx">user</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&</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">&</span><span class="nx">user</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&</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">&</span><span class="nx">email</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&</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 <> ?"</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 >= ? and role <> ?"</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">&</span><span class="nx">users</span><span class="p">)</span>
|
||
<span class="c1">//// SELECT * FROM users WHERE name <> 'jinzhu' AND age >= 20 AND role <> '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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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 <= '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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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 -> 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">&</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">&</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">&</span><span class="nx">user</span><span class="p">)</span>
|
||
<span class="c1">//// user -> 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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</span><span class="nx">users</span><span class="p">).</span><span class="nx">Count</span><span class="p">(</span><span class="o">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">></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">&</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">&</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 > ?"</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">&</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">&</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">&</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">&</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 & Rows</h2>
|
||
|
||
<p>Row & 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">&</span><span class="nx">name</span><span class="p">,</span> <span class="o">&</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">&</span><span class="nx">name</span><span class="p">,</span> <span class="o">&</span><span class="nx">age</span><span class="p">,</span> <span class="o">&</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">&</span><span class="nx">name</span><span class="p">,</span> <span class="o">&</span><span class="nx">age</span><span class="p">,</span> <span class="o">&</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">&</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">&</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 & 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) > ?"</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) > ?"</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</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">&</span><span class="nx">user</span><span class="p">).</span><span class="nx">Related</span><span class="p">(</span><span class="o">&</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">&</span><span class="nx">first_article</span><span class="p">).</span><span class="nx">Count</span><span class="p">(</span><span class="o">&</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">&</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">&</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 > ?"</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">&</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">&</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 > '2013/10/10' AND state = 'cancelled'; (cancelled_orders)</span>
|
||
<span class="c1">//// SELECT * FROM orders WHERE created_at > '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 > ?"</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">&</span><span class="nx">orders</span><span class="p">).</span><span class="nx">Find</span><span class="p">(</span><span class="o">&</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">&</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">&</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">&</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(&[]User{}).Limit(10).Do("Search", "vip", "china")
|
||
db.Mode(&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>
|