-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlearn_database-migrations.md.C2fPzORZ.js
66 lines (66 loc) · 26.5 KB
/
learn_database-migrations.md.C2fPzORZ.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import{_ as s,c as i,o as a,a9 as n}from"./chunks/framework.DgZLXPSQ.js";const E=JSON.parse('{"title":"Migrate database","description":"","frontmatter":{},"headers":[],"relativePath":"learn/database-migrations.md","filePath":"learn/database-migrations.md"}'),t={name:"learn/database-migrations.md"},e=n(`<h1 id="migrate-database" tabindex="-1">Migrate database <a class="header-anchor" href="#migrate-database" aria-label="Permalink to "Migrate database""></a></h1><p class="description"> Axe API doesn't provide a database migration tool internally. But it uses Knex.js which provides a migration tool. In this section, we are going to talk about the basic of the database migration tool. </p><ul class="intro"><li>You will learn</li><li>What is Knex.js?</li><li>How to use Knex CLI?</li><li>How to create a database migration file?</li><li>How to execute migrations?</li></ul><p>Axe API uses <a href="http://knexjs.org/" target="_blank" rel="noreferrer">Knex.js</a> as the <strong>query builder</strong>. But also, it uses <a href="https://knexjs.org/guide/schema-builder.html" target="_blank" rel="noreferrer">The Schema Builder of Knex.js</a>. You may find more things in the original documentation about the migration than here. But we want to describe some fundamentals about the migration structure.</p><p>First of all, we are using the <code>./migrations</code> directory to keep the migration files. Also, we are using the power of <a href="http://knexjs.org/" target="_blank" rel="noreferrer">Knex.js</a> for migrations.</p><h2 id="installation" tabindex="-1">Installation <a class="header-anchor" href="#installation" aria-label="Permalink to "Installation""></a></h2><p>To execute the migrations, you need to install the <strong>Knex CLI</strong> in your development environment;</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> knex</span></span></code></pre></div><p>To test <strong>knex CLI</strong> is accessible, you can use the following command;</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> knex</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Knex</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> CLI</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> version:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0.95.5</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Knex</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Local</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> version:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0.95.5</span></span></code></pre></div><h2 id="using-cli" tabindex="-1">Using CLI <a class="header-anchor" href="#using-cli" aria-label="Permalink to "Using CLI""></a></h2><p>The CLI provides multiple commands to use. On the other hand, <a href="http://knexjs.org/" target="_blank" rel="noreferrer">Knex.js</a> uses <a href="https://nodejs.org/api/modules.html#modules_modules_commonjs_modules" target="_blank" rel="noreferrer">CommonJS</a> as the module system. But we are using <a href="https://nodejs.org/api/esm.html#esm_modules_ecmascript_modules" target="_blank" rel="noreferrer">ECMAScript modules</a>. That's why we should use the <code>--esm</code> option to execute the migration files.</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> knex</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Usage:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cli</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] [command]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Options:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> -V,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --version</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> output</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> the</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> version</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> number</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --debug</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Run</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> with</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> debugging.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --knexfile</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [path] Specify the knexfile path.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --knexpath</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [path] Specify the path to knex instance.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --cwd</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [path] Specify the working directory.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --client</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [name] Set DB client without a knexfile.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --connection</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [address] Set DB connection without a knexfile.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --migrations-directory</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [path] Set migrations directory without a knexfile.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --migrations-table-name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [path] Set migrations table name without a knexfile.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --env</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [name] environment, default: process.env.NODE_ENV </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">||</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> development</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --esm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Enable</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ESM</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> interop.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --specific</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [path] Specify one seed file to execute.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> --timestamp-filename-prefix</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Enable</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> a</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> timestamp</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> prefix</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> on</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> of</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> generated</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> seed</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> files.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> -h,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --help</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> display</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> help</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> for</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> command</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Commands:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> init</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] Create a fresh knexfile.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:make</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Create a named migration file.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:latest</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] Run all migrations that have not yet</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> been</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:up</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [<name>] Run the next or the specified</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migration</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> that</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> has</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> not</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> yet</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> been</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:rollback</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] Rollback the last batch of migrations</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> performed.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:down</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [<name>] Undo the last or the specified</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migration</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> that</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> was</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> already</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> run.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:currentVersion</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> View</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> the</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> current</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> version</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> for</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> the</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migration.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:list</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">migrate:status</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> List</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> all</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migrations</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> files</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> with</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> status.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> migrate:unlock</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Forcibly</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> unlocks</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> the</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migrations</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> lock</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> table.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> seed:make</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Create a named seed file.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> seed:run</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [options] Run seed files.</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> help</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [command] display help </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> command</span></span></code></pre></div><h2 id="create-migration-file" tabindex="-1">Create migration file <a class="header-anchor" href="#create-migration-file" aria-label="Permalink to "Create migration file""></a></h2><p>To create a new migration file in it, you should use the following command;</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> knex</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --esm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migrate:make</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> User</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Using</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> environment:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> development</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Created</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> Migration:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ./migrations/20210515162821_User.js</span></span></code></pre></div><p>If you look the detail of the file (<code>migrations/20210515162821_User.js</code>), you will see the following code;</p><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">up</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">knex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">down</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">knex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {};</span></span></code></pre></div><p>Unfortunately, the CLI created the migration file for CommonJS. We should change it with ESM manually.</p><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> up</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">knex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> down</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">knex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {};</span></span></code></pre></div><p>And this is the basic structure of our migration files.</p><h2 id="upgrading" tabindex="-1">Upgrading <a class="header-anchor" href="#upgrading" aria-label="Permalink to "Upgrading""></a></h2><p>Let's assume that you've written a migration like this;</p><div class="language-js vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> up</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">knex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> knex.schema.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">createTable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">table</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">increments</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"email"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">unique</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> table.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">timestamps</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> });</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> down</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">knex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> knex.schema.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">dropTable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"users"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span></code></pre></div><p>To execute this migration file, you should execute the following command;</p><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> knex</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --esm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migrate:latest</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Using</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> environment:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> development</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Batch</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ran</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> the</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> following</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> migrations:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">20210515162821_User.js</span></span></code></pre></div><p>Yay! You created the first database table.</p><h2 id="next-steps" tabindex="-1">Next steps <a class="header-anchor" href="#next-steps" aria-label="Permalink to "Next steps""></a></h2><p>In this section, we just clarified the fundamentals of database migration.</p><p>In this next section, we are going to talk about file uploads.</p>`,30),h=[e];function l(p,k,r,d,F,g){return a(),i("div",null,h)}const y=s(t,[["render",l]]);export{E as __pageData,y as default};