1234 lines
122 KiB
HTML
1234 lines
122 KiB
HTML
<!DOCTYPE HTML>
|
|
<html lang="" >
|
|
<head>
|
|
<title>CRUD: Reading and Writing Data · GORM Guide</title>
|
|
<meta charset="UTF-8">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
|
|
<meta name="description" content="Refer Associations for more details">
|
|
<meta name="generator" content="GitBook 3.0.0-pre.1">
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="gitbook/style.css">
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="gitbook/gitbook-plugin-prism/prism.css">
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<meta name="HandheldFriendly" content="true"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
|
<link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
|
|
<link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">
|
|
|
|
|
|
<link rel="next" href="curd.html" />
|
|
|
|
|
|
<link rel="prev" href="associations.html" />
|
|
|
|
|
|
</head>
|
|
<body>
|
|
|
|
<div class="book"
|
|
data-level="3"
|
|
data-chapter-title="CRUD: Reading and Writing Data"
|
|
data-filepath="curd.md"
|
|
data-basepath=""
|
|
data-revision="Sun Feb 28 2016 16:13:20 GMT+0800 (CST)"
|
|
data-innerlanguage="">
|
|
|
|
|
|
<div class="book-summary">
|
|
|
|
<nav role="navigation">
|
|
<ul class="summary">
|
|
|
|
|
|
|
|
<li class="chapter " data-level="0" data-path="./">
|
|
|
|
<a href="./">
|
|
|
|
|
|
Getting Started with GORM
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="1" data-path="database.html">
|
|
|
|
<a href="database.html">
|
|
|
|
|
|
<b>1.</b>
|
|
|
|
Database
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<ul class="articles">
|
|
|
|
|
|
<li class="chapter " data-level="1.1" data-path="database.html">
|
|
|
|
<a href="database.html#connecting-to-a-database">
|
|
|
|
|
|
<b>1.1.</b>
|
|
|
|
Database Connection
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="1.2" data-path="database.html">
|
|
|
|
<a href="database.html#migration">
|
|
|
|
|
|
<b>1.2.</b>
|
|
|
|
Migration
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2" data-path="models.html">
|
|
|
|
<a href="models.html">
|
|
|
|
|
|
<b>2.</b>
|
|
|
|
Models
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<ul class="articles">
|
|
|
|
|
|
<li class="chapter " data-level="2.1" data-path="models.html">
|
|
|
|
<a href="models.html#model-defination">
|
|
|
|
|
|
<b>2.1.</b>
|
|
|
|
Model Defination
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.2" data-path="models.html">
|
|
|
|
<a href="models.html#conventions-overriding-conventions">
|
|
|
|
|
|
<b>2.2.</b>
|
|
|
|
Naming Conventions & Overriding
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.3" data-path="associations.html">
|
|
|
|
<a href="associations.html">
|
|
|
|
|
|
<b>2.3.</b>
|
|
|
|
Associations
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<ul class="articles">
|
|
|
|
|
|
<li class="chapter " data-level="2.3.1" data-path="associations.html">
|
|
|
|
<a href="associations.html#belongs-to">
|
|
|
|
|
|
<b>2.3.1.</b>
|
|
|
|
Belongs To
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.3.2" data-path="associations.html">
|
|
|
|
<a href="associations.html#has-one">
|
|
|
|
|
|
<b>2.3.2.</b>
|
|
|
|
Has One
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.3.3" data-path="associations.html">
|
|
|
|
<a href="associations.html#has-many">
|
|
|
|
|
|
<b>2.3.3.</b>
|
|
|
|
Has Many
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.3.4" data-path="associations.html">
|
|
|
|
<a href="associations.html#many-to-many">
|
|
|
|
|
|
<b>2.3.4.</b>
|
|
|
|
Many To Many
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.3.5" data-path="associations.html">
|
|
|
|
<a href="associations.html#polymorphism">
|
|
|
|
|
|
<b>2.3.5.</b>
|
|
|
|
Polymorphism
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="2.3.6" data-path="associations.html">
|
|
|
|
<a href="associations.html#association-mode">
|
|
|
|
|
|
<b>2.3.6.</b>
|
|
|
|
Association Mode
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="chapter active" data-level="3" data-path="curd.html">
|
|
|
|
<a href="curd.html">
|
|
|
|
|
|
<b>3.</b>
|
|
|
|
CRUD: Reading and Writing Data
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<ul class="articles">
|
|
|
|
|
|
<li class="chapter " data-level="3.1" data-path="curd.html">
|
|
|
|
<a href="curd.html#create">
|
|
|
|
|
|
<b>3.1.</b>
|
|
|
|
Create
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="3.2" data-path="curd.html">
|
|
|
|
<a href="curd.html#query">
|
|
|
|
|
|
<b>3.2.</b>
|
|
|
|
Query
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="3.3" data-path="curd.html">
|
|
|
|
<a href="curd.html#preloading">
|
|
|
|
|
|
<b>3.3.</b>
|
|
|
|
Preloading (Eager Loading)
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="3.4" data-path="curd.html">
|
|
|
|
<a href="curd.html#update">
|
|
|
|
|
|
<b>3.4.</b>
|
|
|
|
Update
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="3.5" data-path="curd.html">
|
|
|
|
<a href="curd.html#delete">
|
|
|
|
|
|
<b>3.5.</b>
|
|
|
|
Delete / Soft Delete
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="4" data-path="callbacks.html">
|
|
|
|
<a href="callbacks.html">
|
|
|
|
|
|
<b>4.</b>
|
|
|
|
Callbacks
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="5" data-path="advanced.html">
|
|
|
|
<a href="advanced.html">
|
|
|
|
|
|
<b>5.</b>
|
|
|
|
Advanced Usage
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<ul class="articles">
|
|
|
|
|
|
<li class="chapter " data-level="5.1" data-path="advanced.html">
|
|
|
|
<a href="advanced.html#error-handling">
|
|
|
|
|
|
<b>5.1.</b>
|
|
|
|
Error Handling
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="5.2" data-path="advanced.html">
|
|
|
|
<a href="advanced.html#transactions">
|
|
|
|
|
|
<b>5.2.</b>
|
|
|
|
Transactions
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="5.3" data-path="advanced.html">
|
|
|
|
<a href="advanced.html#sql-builder">
|
|
|
|
|
|
<b>5.3.</b>
|
|
|
|
Raw SQL & SQL Builder
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="5.4" data-path="advanced.html">
|
|
|
|
<a href="advanced.html#compose-primary-key">
|
|
|
|
|
|
<b>5.4.</b>
|
|
|
|
Composite Primary Key
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="5.5" data-path="advanced.html">
|
|
|
|
<a href="advanced.html#logger">
|
|
|
|
|
|
<b>5.5.</b>
|
|
|
|
Overriding Logger
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
<li class="chapter " data-level="6" data-path="development.html">
|
|
|
|
<a href="development.html">
|
|
|
|
|
|
<b>6.</b>
|
|
|
|
Development
|
|
|
|
</a>
|
|
|
|
|
|
|
|
<ul class="articles">
|
|
|
|
|
|
<li class="chapter " data-level="6.1" data-path="development.html">
|
|
|
|
<a href="development.html#callbacks">
|
|
|
|
|
|
<b>6.1.</b>
|
|
|
|
Write Plugins
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
|
|
</li>
|
|
|
|
|
|
<li class="divider"></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</div>
|
|
|
|
|
|
<div class="book-body">
|
|
|
|
<div class="body-inner">
|
|
|
|
|
|
<div class="book-header" role="navigation">
|
|
|
|
|
|
<!-- Title -->
|
|
<h1>
|
|
<i class="fa fa-circle-o-notch fa-spin"></i>
|
|
<a href="" >CRUD: Reading and Writing Data</a>
|
|
</h1>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="page-wrapper" tabindex="-1" role="main">
|
|
<div class="page-inner">
|
|
<section class="normal markdown-section">
|
|
|
|
<h1 id="crud-reading-and-writing-data">CRUD: Reading and Writing Data</h1>
|
|
<!-- toc -->
|
|
<ul>
|
|
<li><a href="#create">Create</a><ul>
|
|
<li><a href="#create-record">Create Record</a></li>
|
|
<li><a href="#create-with-associations">Create With Associations</a></li>
|
|
<li><a href="#default-values">Default Values</a></li>
|
|
<li><a href="#setting-primary-key-in-callbacks">Setting Primary Key In Callbacks</a></li>
|
|
<li><a href="#extra-creating-option">Extra Creating option</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#query">Query</a><ul>
|
|
<li><a href="#query-with-where-plain-sql">Query With Where (Plain SQL)</a></li>
|
|
<li><a href="#query-with-where-struct-map">Query With Where (Struct & Map)</a></li>
|
|
<li><a href="#query-with-not">Query With Not</a></li>
|
|
<li><a href="#query-with-inline-condition">Query With Inline Condition</a></li>
|
|
<li><a href="#query-with-or">Query With Or</a></li>
|
|
<li><a href="#query-chains">Query Chains</a></li>
|
|
<li><a href="#extra-querying-option">Extra Querying option</a></li>
|
|
<li><a href="#firstorinit">FirstOrInit</a><ul>
|
|
<li><a href="#attrs">Attrs</a></li>
|
|
<li><a href="#assign">Assign</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#firstorcreate">FirstOrCreate</a><ul>
|
|
<li><a href="#attrs">Attrs</a></li>
|
|
<li><a href="#assign">Assign</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#select">Select</a></li>
|
|
<li><a href="#order">Order</a></li>
|
|
<li><a href="#limit">Limit</a></li>
|
|
<li><a href="#offset">Offset</a></li>
|
|
<li><a href="#count">Count</a></li>
|
|
<li><a href="#group-having">Group & Having</a></li>
|
|
<li><a href="#joins">Joins</a></li>
|
|
<li><a href="#pluck">Pluck</a></li>
|
|
<li><a href="#scan">Scan</a></li>
|
|
<li><a href="#scopes">Scopes</a></li>
|
|
<li><a href="#specifying-the-table-name">Specifying The Table Name</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#update">Update</a><ul>
|
|
<li><a href="#update-all-fields">Update All Fields</a></li>
|
|
<li><a href="#update-changed-fields">Update Changed Fields</a></li>
|
|
<li><a href="#update-selected-fields">Update Selected Fields</a></li>
|
|
<li><a href="#update-changed-fields-without-callbacks">Update Changed Fields Without Callbacks</a></li>
|
|
<li><a href="#batch-updates">Batch Updates</a></li>
|
|
<li><a href="#update-with-sql-expression">Update with SQL Expression</a></li>
|
|
<li><a href="#change-updating-values-in-callbacks">Change Updating Values In Callbacks</a></li>
|
|
<li><a href="#extra-updating-option">Extra Updating option</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#delete">Delete</a><ul>
|
|
<li><a href="#batch-delete">Batch Delete</a></li>
|
|
<li><a href="#soft-delete">Soft Delete</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<!-- toc stop -->
|
|
<h2 id="create">Create</h2>
|
|
<h3 id="create-record">Create Record</h3>
|
|
<pre><code class="lang-go">user <span class="token operator">:=</span> User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"Jinzhu"</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">18</span><span class="token operator">,</span> Birthday<span class="token operator">:</span> time<span class="token operator">.</span><span class="token function">Now<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">}</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">NewRecord<span class="token punctuation">(</span></span>user<span class="token operator">)</span> <span class="token comment" spellcheck="true">// => returns `true` as primary key is blank</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">NewRecord<span class="token punctuation">(</span></span>user<span class="token operator">)</span> <span class="token comment" spellcheck="true">// => return `false` after `user` created</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Associations will be inserted automatically when save the record</span>
|
|
user <span class="token operator">:=</span> User<span class="token operator">{</span>
|
|
Name<span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">,</span>
|
|
BillingAddress<span class="token operator">:</span> Address<span class="token operator">{</span>Address1<span class="token operator">:</span> <span class="token string">"Billing Address - Address 1"</span><span class="token operator">}</span><span class="token operator">,</span>
|
|
ShippingAddress<span class="token operator">:</span> Address<span class="token operator">{</span>Address1<span class="token operator">:</span> <span class="token string">"Shipping Address - Address 1"</span><span class="token operator">}</span><span class="token operator">,</span>
|
|
Emails<span class="token operator">:</span> <span class="token operator">[</span><span class="token operator">]</span>Email<span class="token operator">{</span><span class="token operator">{</span>Email<span class="token operator">:</span> <span class="token string">"jinzhu@example.com"</span><span class="token operator">}</span><span class="token operator">,</span> <span class="token operator">{</span>Email<span class="token operator">:</span> <span class="token string">"jinzhu-2@example@example.com"</span><span class="token operator">}</span><span class="token operator">}</span><span class="token operator">,</span>
|
|
Languages<span class="token operator">:</span> <span class="token operator">[</span><span class="token operator">]</span>Language<span class="token operator">{</span><span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"ZH"</span><span class="token operator">}</span><span class="token operator">,</span> <span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"EN"</span><span class="token operator">}</span><span class="token operator">}</span><span class="token operator">,</span>
|
|
<span class="token operator">}</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// BEGIN TRANSACTION;</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "addresses" (address1) VALUES ("Billing Address - Address 1");</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "addresses" (address1) VALUES ("Shipping Address - Address 1");</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "users" (name,billing_address_id,shipping_address_id) VALUES ("jinzhu", 1, 2);</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu@example.com");</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu-2@example.com");</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "languages" ("name") VALUES ('ZH');</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO user_languages ("user_id","language_id") VALUES (111, 1);</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "languages" ("name") VALUES ('EN');</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO user_languages ("user_id","language_id") VALUES (111, 2);</span>
|
|
<span class="token comment" spellcheck="true">//// COMMIT;</span>
|
|
</code></pre>
|
|
<h3 id="create-with-associations">Create With Associations</h3>
|
|
<p>Refer Associations for more details</p>
|
|
<h3 id="default-values">Default Values</h3>
|
|
<p>You could defined default value in the <code>sql</code> tag, then the generated creating SQL will ignore these fields that including default value and its value is blank, and after inserted the record into databae, gorm will load those fields's value from database.</p>
|
|
<pre><code class="lang-go"><span class="token keyword">type</span> Animal <span class="token keyword">struct</span> <span class="token operator">{</span>
|
|
ID <span class="token builtin">int64</span>
|
|
Name <span class="token builtin">string</span> <span class="token string">`sql:"default:'galeone'"`</span>
|
|
Age <span class="token builtin">int64</span>
|
|
<span class="token operator">}</span>
|
|
|
|
<span class="token keyword">var</span> animal <span class="token operator">=</span> Animal<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">99</span><span class="token operator">,</span> Name<span class="token operator">:</span> <span class="token string">""</span><span class="token operator">}</span>
|
|
db<span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&</span>animal<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">// INSERT INTO animals("age") values('99');</span>
|
|
<span class="token comment" spellcheck="true">// SELECT name from animals WHERE ID=111; // the returning primary key is 111</span>
|
|
<span class="token comment" spellcheck="true">// animal.Name => 'galeone'</span>
|
|
</code></pre>
|
|
<h3 id="setting-primary-key-in-callbacks">Setting Primary Key In Callbacks</h3>
|
|
<p>If you want to set primary key in <code>BeforeCreate</code> callback, you could use <code>scope.SetColumn</code>, for example:</p>
|
|
<pre><code class="lang-go"><span class="token keyword">func</span> <span class="token operator">(</span>user <span class="token operator">*</span>User<span class="token operator">)</span> <span class="token function">BeforeCreate<span class="token punctuation">(</span></span>scope <span class="token operator">*</span>gorm<span class="token operator">.</span>Scope<span class="token operator">)</span> <span class="token builtin">error</span> <span class="token operator">{</span>
|
|
scope<span class="token operator">.</span><span class="token function">SetColumn<span class="token punctuation">(</span></span><span class="token string">"ID"</span><span class="token operator">,</span> uuid<span class="token operator">.</span><span class="token function">New<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">)</span>
|
|
<span class="token keyword">return</span> <span class="token boolean">nil</span>
|
|
<span class="token operator">}</span>
|
|
</code></pre>
|
|
<h3 id="extra-creating-option">Extra Creating option</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Add extra SQL option for inserting SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Set<span class="token punctuation">(</span></span><span class="token string">"gorm:insert_option"</span><span class="token operator">,</span> <span class="token string">"ON CONFLICT"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Create<span class="token punctuation">(</span></span><span class="token operator">&</span>product<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">// INSERT INTO products (name, code) VALUES ("name", "code") ON CONFLICT;</span>
|
|
</code></pre>
|
|
<h2 id="query">Query</h2>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Get the first record</span>
|
|
db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users ORDER BY id LIMIT 1;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Get the last record</span>
|
|
db<span class="token operator">.</span><span class="token function">Last<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users ORDER BY id DESC LIMIT 1;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Get all records</span>
|
|
db<span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Get record with primary key</span>
|
|
db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> <span class="token number">10</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE id = 10;</span>
|
|
</code></pre>
|
|
<h3 id="query-with-where-plain-sql">Query With Where (Plain SQL)</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Get the first matched record</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'jinzhu' limit 1;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Get all matched records</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'jinzhu';</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name <> ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// IN</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name in (?)"</span><span class="token operator">,</span> <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">string</span><span class="token operator">{</span><span class="token string">"jinzhu"</span><span class="token operator">,</span> <span class="token string">"jinzhu 2"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// LIKE</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name LIKE ?"</span><span class="token operator">,</span> <span class="token string">"%jin%"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// AND</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ? and age >= ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">,</span> <span class="token string">"22"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Time</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"updated_at > ?"</span><span class="token operator">,</span> lastWeek<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"created_at BETWEEN ? AND ?"</span><span class="token operator">,</span> lastWeek<span class="token operator">,</span> today<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="query-with-where-struct--map">Query With Where (Struct & Map)</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Struct</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token operator">&</span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20 LIMIT 1;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Map</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">,</span> <span class="token string">"age"</span><span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = "jinzhu" AND age = 20;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Slice of primary keys</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">int64</span><span class="token operator">{</span><span class="token number">20</span><span class="token operator">,</span> <span class="token number">21</span><span class="token operator">,</span> <span class="token number">22</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE id IN (20, 21, 22);</span>
|
|
</code></pre>
|
|
<h3 id="query-with-not">Query With Not</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name <> "jinzhu" LIMIT 1;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Not In</span>
|
|
db<span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">string</span><span class="token operator">{</span><span class="token string">"jinzhu"</span><span class="token operator">,</span> <span class="token string">"jinzhu 2"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name NOT IN ("jinzhu", "jinzhu 2");</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Not In slice of primary keys</span>
|
|
db<span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">int64</span><span class="token operator">{</span><span class="token number">1</span><span class="token operator">,</span><span class="token number">2</span><span class="token operator">,</span><span class="token number">3</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE id NOT IN (1,2,3);</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">int64</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Plain SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE NOT(name = "jinzhu");</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Struct</span>
|
|
db<span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name <> "jinzhu";</span>
|
|
</code></pre>
|
|
<h3 id="query-with-inline-condition">Query With Inline Condition</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Get by primary key</span>
|
|
db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> <span class="token number">23</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE id = 23 LIMIT 1;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Plain SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> <span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = "jinzhu";</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">,</span> <span class="token string">"name <> ? AND age > ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">,</span> <span class="token number">20</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name <> "jinzhu" AND age > 20;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Struct</span>
|
|
db<span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">,</span> User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE age = 20;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Map</span>
|
|
db<span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">,</span> <span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"age"</span><span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE age = 20;</span>
|
|
</code></pre>
|
|
<h3 id="query-with-or">Query With Or</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"role = ?"</span><span class="token operator">,</span> <span class="token string">"admin"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Or<span class="token punctuation">(</span></span><span class="token string">"role = ?"</span><span class="token operator">,</span> <span class="token string">"super_admin"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE role = 'admin' OR role = 'super_admin';</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Struct</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = 'jinzhu'"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Or<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"jinzhu 2"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2';</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Map</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = 'jinzhu'"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Or<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"jinzhu 2"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="query-chains">Query Chains</h3>
|
|
<p>Gorm has a chainable API, you could use it like this</p>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name <> ?"</span><span class="token operator">,</span><span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"age >= ? and role <> ?"</span><span class="token operator">,</span><span class="token number">20</span><span class="token operator">,</span><span class="token string">"admin"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name <> 'jinzhu' AND age >= 20 AND role <> 'admin';</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"role = ?"</span><span class="token operator">,</span> <span class="token string">"admin"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Or<span class="token punctuation">(</span></span><span class="token string">"role = ?"</span><span class="token operator">,</span> <span class="token string">"super_admin"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Not<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="extra-querying-option">Extra Querying option</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Add extra SQL option for selecting SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Set<span class="token punctuation">(</span></span><span class="token string">"gorm:query_option"</span><span class="token operator">,</span> <span class="token string">"FOR UPDATE"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> <span class="token number">10</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE id = 10 FOR UPDATE;</span>
|
|
</code></pre>
|
|
<h3 id="firstorinit">FirstOrInit</h3>
|
|
<p>Get the first matched record, or initialize a record with search conditions.</p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Unfound</span>
|
|
db<span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"non_existing"</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Name: "non_existing"}</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Found</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"Jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "Jinzhu", Age: 20}</span>
|
|
db<span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> <span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "Jinzhu", Age: 20}</span>
|
|
</code></pre>
|
|
<h4 id="attrs">Attrs</h4>
|
|
<p>Ignore some values when searching, but use them to initialize the struct if record is not found.</p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Unfound</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"non_existing"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Attrs<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM USERS WHERE name = 'non_existing';</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Name: "non_existing", Age: 20}</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"noexisting_user"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Attrs<span class="token punctuation">(</span></span><span class="token string">"age"</span><span class="token operator">,</span> <span class="token number">20</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM USERS WHERE name = 'non_existing';</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Name: "non_existing", Age: 20}</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Found</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"Jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Attrs<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">30</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM USERS WHERE name = jinzhu';</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "Jinzhu", Age: 20}</span>
|
|
</code></pre>
|
|
<h4 id="assign">Assign</h4>
|
|
<p>Ignore some values when searching, but assign it to the result regardless it is found or not.</p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Unfound</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"non_existing"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Assign<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Name: "non_existing", Age: 20}</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Found</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"Jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Assign<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">30</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrInit<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM USERS WHERE name = jinzhu';</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "Jinzhu", Age: 30}</span>
|
|
</code></pre>
|
|
<h3 id="firstorcreate">FirstOrCreate</h3>
|
|
<p>Get the first matched record, or create with search conditions.</p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Unfound</span>
|
|
db<span class="token operator">.</span><span class="token function">FirstOrCreate<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">,</span> User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"non_existing"</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "users" (name) VALUES ("non_existing");</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 112, Name: "non_existing"}</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Found</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"Jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrCreate<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "Jinzhu"}</span>
|
|
</code></pre>
|
|
<h4 id="attrs">Attrs</h4>
|
|
<p>Ignore some values when searching, but use them to create the struct if record is not found. like <code>FirstOrInit</code></p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Unfound</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"non_existing"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Attrs<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrCreate<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'non_existing';</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "users" (name, age) VALUES ("non_existing", 20);</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 112, Name: "non_existing", Age: 20}</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Found</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Attrs<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">30</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrCreate<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'jinzhu';</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "jinzhu", Age: 20}</span>
|
|
</code></pre>
|
|
<h4 id="assign">Assign</h4>
|
|
<p>Ignore some values when searching, but assign it to the record regardless it is found or not, then save back to database. like <code>FirstOrInit</code></p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Unfound</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"non_existing"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Assign<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">20</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrCreate<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'non_existing';</span>
|
|
<span class="token comment" spellcheck="true">//// INSERT INTO "users" (name, age) VALUES ("non_existing", 20);</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 112, Name: "non_existing", Age: 20}</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Found</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"jinzhu"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Assign<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Age<span class="token operator">:</span> <span class="token number">30</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">FirstOrCreate<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE name = 'jinzhu';</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET age=30 WHERE id = 111;</span>
|
|
<span class="token comment" spellcheck="true">//// user -> User{Id: 111, Name: "jinzhu", Age: 30}</span>
|
|
</code></pre>
|
|
<h3 id="select">Select</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"name, age"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT name, age FROM users;</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">string</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token string">"age"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT name, age FROM users;</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"COALESCE(age,?)"</span><span class="token operator">,</span> <span class="token number">42</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT COALESCE(age,'42') FROM users;</span>
|
|
</code></pre>
|
|
<h3 id="order">Order</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Order<span class="token punctuation">(</span></span><span class="token string">"age desc, name"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users ORDER BY age desc, name;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Multiple orders</span>
|
|
db<span class="token operator">.</span><span class="token function">Order<span class="token punctuation">(</span></span><span class="token string">"age desc"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Order<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users ORDER BY age desc, name;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// ReOrder</span>
|
|
db<span class="token operator">.</span><span class="token function">Order<span class="token punctuation">(</span></span><span class="token string">"age desc"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users1<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Order<span class="token punctuation">(</span></span><span class="token string">"age"</span><span class="token operator">,</span> <span class="token boolean">true</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users2<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users ORDER BY age desc; (users1)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users ORDER BY age; (users2)</span>
|
|
</code></pre>
|
|
<h3 id="limit">Limit</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Limit<span class="token punctuation">(</span></span><span class="token number">3</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users LIMIT 3;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Cancel limit condition with -1</span>
|
|
db<span class="token operator">.</span><span class="token function">Limit<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users1<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Limit<span class="token punctuation">(</span></span><span class="token operator">-</span><span class="token number">1</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users2<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users LIMIT 10; (users1)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users; (users2)</span>
|
|
</code></pre>
|
|
<h3 id="offset">Offset</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Offset<span class="token punctuation">(</span></span><span class="token number">3</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users OFFSET 3;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Cancel offset condition with -1</span>
|
|
db<span class="token operator">.</span><span class="token function">Offset<span class="token punctuation">(</span></span><span class="token number">10</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users1<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Offset<span class="token punctuation">(</span></span><span class="token operator">-</span><span class="token number">1</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users2<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users OFFSET 10; (users1)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users; (users2)</span>
|
|
</code></pre>
|
|
<h3 id="count">Count</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Or<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu 2"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Count<span class="token punctuation">(</span></span><span class="token operator">&</span>count<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * from USERS WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (users)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT count(*) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'; (count)</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Count<span class="token punctuation">(</span></span><span class="token operator">&</span>count<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT count(*) FROM users WHERE name = 'jinzhu'; (count)</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"deleted_users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Count<span class="token punctuation">(</span></span><span class="token operator">&</span>count<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT count(*) FROM deleted_users;</span>
|
|
</code></pre>
|
|
<h3 id="group--having">Group & Having</h3>
|
|
<pre><code class="lang-go">rows<span class="token operator">,</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"orders"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"date(created_at) as date, sum(amount) as total"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Group<span class="token punctuation">(</span></span><span class="token string">"date(created_at)"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span>
|
|
<span class="token keyword">for</span> rows<span class="token operator">.</span><span class="token function">Next<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
|
|
<span class="token operator">...</span>
|
|
<span class="token operator">}</span>
|
|
|
|
rows<span class="token operator">,</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"orders"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"date(created_at) as date, sum(amount) as total"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Group<span class="token punctuation">(</span></span><span class="token string">"date(created_at)"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Having<span class="token punctuation">(</span></span><span class="token string">"sum(amount) > ?"</span><span class="token operator">,</span> <span class="token number">100</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span>
|
|
<span class="token keyword">for</span> rows<span class="token operator">.</span><span class="token function">Next<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
|
|
<span class="token operator">...</span>
|
|
<span class="token operator">}</span>
|
|
|
|
<span class="token keyword">type</span> Result <span class="token keyword">struct</span> <span class="token operator">{</span>
|
|
Date time<span class="token operator">.</span>Time
|
|
Total <span class="token builtin">int64</span>
|
|
<span class="token operator">}</span>
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"orders"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"date(created_at) as date, sum(amount) as total"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Group<span class="token punctuation">(</span></span><span class="token string">"date(created_at)"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Having<span class="token punctuation">(</span></span><span class="token string">"sum(amount) > ?"</span><span class="token operator">,</span> <span class="token number">100</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&</span>results<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="joins">Joins</h3>
|
|
<pre><code class="lang-go">rows<span class="token operator">,</span> err <span class="token operator">:=</span> db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"users.name, emails.email"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Joins<span class="token punctuation">(</span></span><span class="token string">"left join emails on emails.user_id = users.id"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Rows<span class="token punctuation">(</span></span><span class="token operator">)</span>
|
|
<span class="token keyword">for</span> rows<span class="token operator">.</span><span class="token function">Next<span class="token punctuation">(</span></span><span class="token operator">)</span> <span class="token operator">{</span>
|
|
<span class="token operator">...</span>
|
|
<span class="token operator">}</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"users.name, emails.email"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Joins<span class="token punctuation">(</span></span><span class="token string">"left join emails on emails.user_id = users.id"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&</span>results<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// multiple joins with parameter</span>
|
|
db<span class="token operator">.</span><span class="token function">Joins<span class="token punctuation">(</span></span><span class="token string">"JOIN emails ON emails.user_id = users.id AND emails.email = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu@example.org"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Joins<span class="token punctuation">(</span></span><span class="token string">"JOIN credit_cards ON credit_cards.user_id = users.id"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"credit_cards.number = ?"</span><span class="token operator">,</span> <span class="token string">"411111111111"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="pluck">Pluck</h3>
|
|
<p>Get selected attributes as map</p>
|
|
<pre><code class="lang-go"><span class="token keyword">var</span> ages <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">int64</span>
|
|
db<span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Pluck<span class="token punctuation">(</span></span><span class="token string">"age"</span><span class="token operator">,</span> <span class="token operator">&</span>ages<span class="token operator">)</span>
|
|
|
|
<span class="token keyword">var</span> names <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">string</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Pluck<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token operator">&</span>names<span class="token operator">)</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"deleted_users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Pluck<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token operator">&</span>names<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Requesting more than one column? Do it like this:</span>
|
|
db<span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"name, age"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="scan">Scan</h3>
|
|
<p>Scan results into another struct.</p>
|
|
<pre><code class="lang-go"><span class="token keyword">type</span> Result <span class="token keyword">struct</span> <span class="token operator">{</span>
|
|
Name <span class="token builtin">string</span>
|
|
Age <span class="token builtin">int</span>
|
|
<span class="token operator">}</span>
|
|
|
|
<span class="token keyword">var</span> result Result
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"name, age"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token number">3</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&</span>result<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Raw SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Raw<span class="token punctuation">(</span></span><span class="token string">"SELECT name, age FROM users WHERE name = ?"</span><span class="token operator">,</span> <span class="token number">3</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Scan<span class="token punctuation">(</span></span><span class="token operator">&</span>result<span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="scopes">Scopes</h3>
|
|
<pre><code class="lang-go"><span class="token keyword">func</span> <span class="token function">AmountGreaterThan1000<span class="token punctuation">(</span></span>db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> <span class="token operator">*</span>gorm<span class="token operator">.</span>DB <span class="token operator">{</span>
|
|
<span class="token keyword">return</span> db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"amount > ?"</span><span class="token operator">,</span> <span class="token number">1000</span><span class="token operator">)</span>
|
|
<span class="token operator">}</span>
|
|
|
|
<span class="token keyword">func</span> <span class="token function">PaidWithCreditCard<span class="token punctuation">(</span></span>db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> <span class="token operator">*</span>gorm<span class="token operator">.</span>DB <span class="token operator">{</span>
|
|
<span class="token keyword">return</span> db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"pay_mode_sign = ?"</span><span class="token operator">,</span> <span class="token string">"C"</span><span class="token operator">)</span>
|
|
<span class="token operator">}</span>
|
|
|
|
<span class="token keyword">func</span> <span class="token function">PaidWithCod<span class="token punctuation">(</span></span>db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> <span class="token operator">*</span>gorm<span class="token operator">.</span>DB <span class="token operator">{</span>
|
|
<span class="token keyword">return</span> db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"pay_mode_sign = ?"</span><span class="token operator">,</span> <span class="token string">"C"</span><span class="token operator">)</span>
|
|
<span class="token operator">}</span>
|
|
|
|
<span class="token keyword">func</span> <span class="token function">OrderStatus<span class="token punctuation">(</span></span>status <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">string</span><span class="token operator">)</span> <span class="token keyword">func</span> <span class="token operator">(</span>db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> <span class="token operator">*</span>gorm<span class="token operator">.</span>DB <span class="token operator">{</span>
|
|
<span class="token keyword">return</span> <span class="token keyword">func</span> <span class="token operator">(</span>db <span class="token operator">*</span>gorm<span class="token operator">.</span>DB<span class="token operator">)</span> <span class="token operator">*</span>gorm<span class="token operator">.</span>DB <span class="token operator">{</span>
|
|
<span class="token keyword">return</span> db<span class="token operator">.</span><span class="token function">Scopes<span class="token punctuation">(</span></span>AmountGreaterThan1000<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"status in (?)"</span><span class="token operator">,</span> status<span class="token operator">)</span>
|
|
<span class="token operator">}</span>
|
|
<span class="token operator">}</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Scopes<span class="token punctuation">(</span></span>AmountGreaterThan1000<span class="token operator">,</span> PaidWithCreditCard<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>orders<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">// Find all credit card orders and amount greater than 1000</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Scopes<span class="token punctuation">(</span></span>AmountGreaterThan1000<span class="token operator">,</span> PaidWithCod<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>orders<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">// Find all COD orders and amount greater than 1000</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Scopes<span class="token punctuation">(</span></span><span class="token function">OrderStatus<span class="token punctuation">(</span></span><span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">string</span><span class="token operator">{</span><span class="token string">"paid"</span><span class="token operator">,</span> <span class="token string">"shipped"</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>orders<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">// Find all paid, shipped orders</span>
|
|
</code></pre>
|
|
<h3 id="specifying-the-table-name">Specifying The Table Name</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Create `deleted_users` table with struct User's definition</span>
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"deleted_users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">CreateTable<span class="token punctuation">(</span></span><span class="token operator">&</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
|
|
<span class="token keyword">var</span> deleted_users <span class="token operator">[</span><span class="token operator">]</span>User
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"deleted_users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>deleted_users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM deleted_users;</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"deleted_users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"name = ?"</span><span class="token operator">,</span> <span class="token string">"jinzhu"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// DELETE FROM deleted_users WHERE name = 'jinzhu';</span>
|
|
</code></pre>
|
|
<h2 id="update">Update</h2>
|
|
<h3 id="update-all-fields">Update All Fields</h3>
|
|
<p><code>Save</code> will include all fields when perform the Updating SQL, even it is not changed</p>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">First<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
|
|
user<span class="token operator">.</span>Name <span class="token operator">=</span> <span class="token string">"jinzhu 2"</span>
|
|
user<span class="token operator">.</span>Age <span class="token operator">=</span> <span class="token number">100</span>
|
|
db<span class="token operator">.</span><span class="token function">Save<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='jinzhu 2', age=100, birthday='2016-01-01', updated_at = '2013-11-17 21:34:10' WHERE id=111;</span>
|
|
</code></pre>
|
|
<h3 id="update-changed-fields">Update Changed Fields</h3>
|
|
<p>If you only want to update changed Fields, you could use <code>Update</code>, <code>Updates</code></p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Update single attribute if it is changed</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token string">"hello"</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Update single attribute with combined conditions</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"active = ?"</span><span class="token operator">,</span> <span class="token boolean">true</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token string">"hello"</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;</span>
|
|
|
|
|
|
<span class="token comment" spellcheck="true">// Update multiple attributes with `map`, will only update those changed fields</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> <span class="token string">"age"</span><span class="token operator">:</span> <span class="token number">18</span><span class="token operator">,</span> <span class="token string">"actived"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Update multiple attributes with `struct`, will only update those changed & non blank fields</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">18</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// WARNING when update with struct, GORM will only update those fields that with non blank value</span>
|
|
<span class="token comment" spellcheck="true">// For below Update, nothing will be updated as "", 0, false are blank values of their types</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">""</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">0</span><span class="token operator">,</span> Actived<span class="token operator">:</span> <span class="token boolean">false</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
</code></pre>
|
|
<h3 id="update-selected-fields">Update Selected Fields</h3>
|
|
<p>If you only want to update or ignore some fields when updating, you could use <code>Select</code>, <code>Omit</code></p>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Select<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> <span class="token string">"age"</span><span class="token operator">:</span> <span class="token number">18</span><span class="token operator">,</span> <span class="token string">"actived"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;</span>
|
|
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Omit<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> <span class="token string">"age"</span><span class="token operator">:</span> <span class="token number">18</span><span class="token operator">,</span> <span class="token string">"actived"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET age=18, actived=false, updated_at='2013-11-17 21:34:10' WHERE id=111;</span>
|
|
</code></pre>
|
|
<h3 id="update-changed-fields-without-callbacks">Update Changed Fields Without Callbacks</h3>
|
|
<p>Updating operations above will invoke <code>BeforeUpdate</code>, <code>AfterUpdate</code>, Update UpdatedAt timestamp, Save Associations callbacks, if you don't call them, you could use <code>UpdateColumn</code>, <code>UpdateColumns</code></p>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Update single attribute, similar with `Update`</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">UpdateColumn<span class="token punctuation">(</span></span><span class="token string">"name"</span><span class="token operator">,</span> <span class="token string">"hello"</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello' WHERE id = 111;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Update multiple attributes, similar with `Updates`</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">UpdateColumns<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">18</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', age=18 WHERE id = 111;</span>
|
|
</code></pre>
|
|
<h3 id="batch-updates">Batch Updates</h3>
|
|
<p>Callbacks won't run when do batch updates</p>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Table<span class="token punctuation">(</span></span><span class="token string">"users"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"id IN (?)"</span><span class="token operator">,</span> <span class="token operator">[</span><span class="token operator">]</span><span class="token builtin">int</span><span class="token operator">{</span><span class="token number">10</span><span class="token operator">,</span> <span class="token number">11</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"name"</span><span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> <span class="token string">"age"</span><span class="token operator">:</span> <span class="token number">18</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', age=18 WHERE id IN (10, 11);</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Update with struct only works with none zero values, or use map[string]interface{}</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">18</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', age=18;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Get updated records count with `RowsAffected`</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span>User<span class="token operator">{</span>Name<span class="token operator">:</span> <span class="token string">"hello"</span><span class="token operator">,</span> Age<span class="token operator">:</span> <span class="token number">18</span><span class="token operator">}</span><span class="token operator">)</span><span class="token operator">.</span>RowsAffected
|
|
</code></pre>
|
|
<h3 id="update-with-sql-expression">Update with SQL Expression</h3>
|
|
<pre><code class="lang-go">DB<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>product<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">"price"</span><span class="token operator">,</span> gorm<span class="token operator">.</span><span class="token function">Expr<span class="token punctuation">(</span></span><span class="token string">"price * ? + ?"</span><span class="token operator">,</span> <span class="token number">2</span><span class="token operator">,</span> <span class="token number">100</span><span class="token operator">)</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE "products" SET "price" = price * '2' + '100', "updated_at" = '2013-11-17 21:34:10' WHERE "id" = '2';</span>
|
|
|
|
DB<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>product<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Updates<span class="token punctuation">(</span></span><span class="token keyword">map</span><span class="token operator">[</span><span class="token builtin">string</span><span class="token operator">]</span><span class="token keyword">interface</span><span class="token operator">{</span><span class="token operator">}</span><span class="token operator">{</span><span class="token string">"price"</span><span class="token operator">:</span> gorm<span class="token operator">.</span><span class="token function">Expr<span class="token punctuation">(</span></span><span class="token string">"price * ? + ?"</span><span class="token operator">,</span> <span class="token number">2</span><span class="token operator">,</span> <span class="token number">100</span><span class="token operator">)</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE "products" SET "price" = price * '2' + '100', "updated_at" = '2013-11-17 21:34:10' WHERE "id" = '2';</span>
|
|
|
|
DB<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>product<span class="token operator">)</span><span class="token operator">.</span><span class="token function">UpdateColumn<span class="token punctuation">(</span></span><span class="token string">"quantity"</span><span class="token operator">,</span> gorm<span class="token operator">.</span><span class="token function">Expr<span class="token punctuation">(</span></span><span class="token string">"quantity - ?"</span><span class="token operator">,</span> <span class="token number">1</span><span class="token operator">)</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = '2';</span>
|
|
|
|
DB<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>product<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"quantity > 1"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">UpdateColumn<span class="token punctuation">(</span></span><span class="token string">"quantity"</span><span class="token operator">,</span> gorm<span class="token operator">.</span><span class="token function">Expr<span class="token punctuation">(</span></span><span class="token string">"quantity - ?"</span><span class="token operator">,</span> <span class="token number">1</span><span class="token operator">)</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE "products" SET "quantity" = quantity - 1 WHERE "id" = '2' AND quantity > 1;</span>
|
|
</code></pre>
|
|
<h3 id="change-updating-values-in-callbacks">Change Updating Values In Callbacks</h3>
|
|
<p>If you want to change updating values in callbacks using <code>BeforeUpdate</code>, <code>BeforeSave</code>, you could use <code>scope.SetColumn</code>, for example:</p>
|
|
<pre><code class="lang-go"><span class="token keyword">func</span> <span class="token operator">(</span>user <span class="token operator">*</span>User<span class="token operator">)</span> <span class="token function">BeforeSave<span class="token punctuation">(</span></span>scope <span class="token operator">*</span>gorm<span class="token operator">.</span>Scope<span class="token operator">)</span> <span class="token operator">(</span>err <span class="token builtin">error</span><span class="token operator">)</span> <span class="token operator">{</span>
|
|
<span class="token keyword">if</span> pw<span class="token operator">,</span> err <span class="token operator">:=</span> bcrypt<span class="token operator">.</span><span class="token function">GenerateFromPassword<span class="token punctuation">(</span></span>user<span class="token operator">.</span>Password<span class="token operator">,</span> <span class="token number">0</span><span class="token operator">)</span><span class="token operator">;</span> err <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token operator">{</span>
|
|
scope<span class="token operator">.</span><span class="token function">SetColumn<span class="token punctuation">(</span></span><span class="token string">"EncryptedPassword"</span><span class="token operator">,</span> pw<span class="token operator">)</span>
|
|
<span class="token operator">}</span>
|
|
<span class="token operator">}</span>
|
|
</code></pre>
|
|
<h3 id="extra-updating-option">Extra Updating option</h3>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Add extra SQL option for updating SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Model<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span><span class="token operator">.</span><span class="token function">Set<span class="token punctuation">(</span></span><span class="token string">"gorm:update_option"</span><span class="token operator">,</span> <span class="token string">"OPTION (OPTIMIZE FOR UNKNOWN)"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Update<span class="token punctuation">(</span></span><span class="token string">"name, "</span>hello"<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET name='hello', updated_at = '2013-11-17 21:34:10' WHERE id=111 OPTION (OPTIMIZE FOR UNKNOWN);</span>
|
|
</code></pre>
|
|
<h2 id="delete">Delete</h2>
|
|
<pre><code class="lang-go"><span class="token comment" spellcheck="true">// Delete an existing record</span>
|
|
db<span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">&</span>email<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// DELETE from emails where id=10;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Add extra SQL option for deleting SQL</span>
|
|
db<span class="token operator">.</span><span class="token function">Set<span class="token punctuation">(</span></span><span class="token string">"gorm:delete_option"</span><span class="token operator">,</span> <span class="token string">"OPTION (OPTIMIZE FOR UNKNOWN)"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">&</span>email<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// DELETE from emails where id=10 OPTION (OPTIMIZE FOR UNKNOWN);</span>
|
|
</code></pre>
|
|
<h3 id="batch-delete">Batch Delete</h3>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"email LIKE ?"</span><span class="token operator">,</span> <span class="token string">"%jinzhu%"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span>Email<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// DELETE from emails where email LIKE "%jinhu%";</span>
|
|
</code></pre>
|
|
<h3 id="soft-delete">Soft Delete</h3>
|
|
<p>If struct has <code>DeletedAt</code> field, it will get soft delete ability automatically!
|
|
Then it won't be deleted from database permanently when call <code>Delete</code>.</p>
|
|
<pre><code class="lang-go">db<span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Batch Delete</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"age = ?"</span><span class="token operator">,</span> <span class="token number">20</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">&</span>User<span class="token operator">{</span><span class="token operator">}</span><span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Soft deleted records will be ignored when query them</span>
|
|
db<span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"age = 20"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>user<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Find soft deleted records with Unscoped</span>
|
|
db<span class="token operator">.</span><span class="token function">Unscoped<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Where<span class="token punctuation">(</span></span><span class="token string">"age = 20"</span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Find<span class="token punctuation">(</span></span><span class="token operator">&</span>users<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// SELECT * FROM users WHERE age = 20;</span>
|
|
|
|
<span class="token comment" spellcheck="true">// Delete record permanently with Unscoped</span>
|
|
db<span class="token operator">.</span><span class="token function">Unscoped<span class="token punctuation">(</span></span><span class="token operator">)</span><span class="token operator">.</span><span class="token function">Delete<span class="token punctuation">(</span></span><span class="token operator">&</span>order<span class="token operator">)</span>
|
|
<span class="token comment" spellcheck="true">//// DELETE FROM orders WHERE id=10;</span>
|
|
</code></pre>
|
|
|
|
|
|
</section>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<a href="associations.html" class="navigation navigation-prev " aria-label="Previous page: Association Mode">
|
|
<i class="fa fa-angle-left"></i>
|
|
</a>
|
|
|
|
|
|
<a href="curd.html" class="navigation navigation-next " aria-label="Next page: Create">
|
|
<i class="fa fa-angle-right"></i>
|
|
</a>
|
|
|
|
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<script src="gitbook/app.js"></script>
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-github/plugin.js"></script>
|
|
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-edit-link/plugin.js"></script>
|
|
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-anker-enable/anker.js"></script>
|
|
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-search/lunr.min.js"></script>
|
|
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-search/search.js"></script>
|
|
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-sharing/buttons.js"></script>
|
|
|
|
|
|
|
|
<script src="gitbook/gitbook-plugin-fontsettings/buttons.js"></script>
|
|
|
|
|
|
<script>
|
|
require(["gitbook"], function(gitbook) {
|
|
gitbook.start({"fontsettings":{"theme":"night","family":"sans","size":4},"toc":{"addClass":true,"className":"toc"},"github":{"url":"https://github.com/jinzhu/gorm"},"edit-link":{"base":"https://github.com/jinzhu/gorm/edit/master","label":"Edit This Page"},"prism":{},"anker-enable":{},"search":{"maxIndexSize":1000000},"sharing":{"all":["facebook","google","instapaper","twitter","weibo"],"facebook":true,"google":false,"instapaper":false,"twitter":true,"vk":false,"weibo":false},"theme-default":{"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}}});
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|