{"id":454,"date":"2021-04-28T00:00:00","date_gmt":"2021-04-28T00:00:00","guid":{"rendered":"https:\/\/en.pingcap.com\/blog\/getting-started-with-rails-tidb\/"},"modified":"2024-08-20T06:41:42","modified_gmt":"2024-08-20T13:41:42","slug":"getting-started-with-rails-tidb","status":"publish","type":"post","link":"https:\/\/www.pingcap.com\/ko\/blog\/getting-started-with-rails-tidb\/","title":{"rendered":"Getting Started with Rails &#038; TiDB"},"content":{"rendered":"<p><em>An original version of this article was published on <a href=\"https:\/\/dev.to\/hooopo\/getting-started-with-rails-tidb-4pni\">dev.to<\/a>.<\/em><\/p>\n<p>This tutorial, perhaps, is the first Rails + TiDB integration tutorial across the web. <a href=\"https:\/\/pingcap.com\/products\/tidb\">TiDB<\/a> is an open-source, distributed SQL database that features horizontal scalability, high availability, and MySQL compatibility.<\/p>\n<p>For beginners, integrating a complex ORM like ActiveRecord with TiDB could be difficult. Since there are few articles on the web touching this topic, I wrote this tutorial to help Rails users to get started with TiDB.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Build_a_local_TiDB_development_environment\"><\/span>Build a local TiDB development environment<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Before integrating with Rails, you need to deploy a TiDB cluster on your local machine. TiDB provides a smooth deployment experience using <a href=\"https:\/\/docs.pingcap.com\/tidb\/dev\/tiup-overview\">TiUP<\/a>, a package manager for the TiDB ecosystem.<\/p>\n<h3>Install TiUP<\/h3>\n<p><a href=\"https:\/\/docs.pingcap.com\/tidb\/dev\/tiup-overview#install-tiup\">Installing TiUP<\/a> is pretty straightforward for either Darwin or Linux operating systems. All you need to do is a single line of command:<\/p>\n<p>{{&lt; copyable &#8220;shell-regular&#8221; &gt;}}<\/p>\n<pre><code class=\"language-shell\">curl --proto '=https' --tlsv1.2 -sSf https:\/\/tiup-mirrors.pingcap.com\/install.sh | sh\n<\/code><\/pre>\n<p>This will also add <code>$HOME\/.tiup\/bin<\/code> in your <code>PATH<\/code> environment variable, so you can use TiUP directly.<\/p>\n<h3>Spin up a local cluster<\/h3>\n<p>As a typical TiDB cluster requires multiple nodes, deploying it might be time-consuming and complicated. Therefore, TiUP offers <a href=\"https:\/\/docs.pingcap.com\/tidb\/dev\/tiup-playground\"><code>playground<\/code><\/a>, a TiUP component that enables you to quickly build a local TiDB test environment.<\/p>\n<p>The command is as simple as follows:<\/p>\n<p>{{&lt; copyable &#8220;shell-regular&#8221; &gt;}}<\/p>\n<pre><code class=\"language-shell\">tiup playground\n<\/code><\/pre>\n<p>You&#8217;ll see the output like this:<\/p>\n<pre><code>tiup playground\nStarting component ``playground``: \/Users\/hooopo\/.tiup\/components\/playground\/v1.4.1\/tiup-playground\nUse the latest stable version: v5.0.0\n\n    Specify version manually: tiup playground &lt;version&gt;\n    The stable version: tiup playground v4.0.0\n    The nightly version: tiup playground nightly\n\nPlayground Bootstrapping...\nStart pd instance\nStart tikv instance\nStart tidb instance\nWaiting for tidb instances ready\n127.0.0.1:4000 ... Done\nStart tiflash instance\nWaiting for tiflash instances ready\n127.0.0.1:3930 ... Done\nCLUSTER START SUCCESSFULLY, Enjoy it ^-^\nTo connect TiDB: mysql --host 127.0.0.1 --port 4000 -u root -p (no password)\nTo view the dashboard: http:\/\/127.0.0.1:2379\/dashboard\nTo view the Prometheus: http:\/\/127.0.0.1:9090\nTo view the Grafana: http:\/\/127.0.0.1:3000\n<\/code><\/pre>\n<p>Congrats! Your local cluster is now up and running.<\/p>\n<h3>Access TiDB Dashboard<\/h3>\n<p>TiDB provides <a href=\"https:\/\/docs.pingcap.com\/tidb\/dev\/dashboard-intro\">TiDB Dashboard<\/a>, a Web UI for monitoring your cluster. It is already built into the PD component, so you can directly access it via http:\/\/127.0.0.1:2379\/dashboard.<\/p>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-18950\" src=\"https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard.jpg\" alt=\"TiDB Dashboard overview\" width=\"2048\" height=\"1154\" srcset=\"https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard.jpg 2048w, https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard-300x169.jpg 300w, https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard-1024x577.jpg 1024w, https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard-768x433.jpg 768w, https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard-1536x866.jpg 1536w, https:\/\/static.pingcap.com\/files\/2021\/04\/20064049\/rails-and-tidb-access-tidb-dashboard-1440x811.jpg 1440w\" sizes=\"auto, (max-width: 2048px) 100vw, 2048px\" \/>\n<p>For more information on TiUP, see the <a href=\"https:\/\/docs.pingcap.com\/tidb\/stable\/tiup-overview\">official documentation<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Configure_Rails_for_TiDB\"><\/span>Configure Rails for TiDB<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Now that you have a running TiDB cluster, the next step is to integrate it with Rails.<\/p>\n<h3>Create a Rails project<\/h3>\n<p>Because TiDB is compatible with MySQL, you can create a Rails app configured for MySQL:<\/p>\n<pre><code class=\"language-shell\">rails new myapp --database=mysql\n<\/code><\/pre>\n<h3>Configure <code>database.yml<\/code><\/h3>\n<p>There are two configurations you need to pay attention to in <code>database.yml<\/code>:<\/p>\n<ul>\n<li>Set <code>port<\/code> to <code>4000<\/code>. The local TiDB cluster uses <code>4000<\/code> as the default port.<\/li>\n<li>Set the database connection variable <code>tidb_enable_noop_functions<\/code> to <code>ON<\/code>. Rails needs to use the <code>get_lock<\/code> function. It is not implemented in TiDB, but a <a href=\"https:\/\/docs.pingcap.com\/tidb\/stable\/system-variables#tidb_enable_noop_functions-new-in-v40\">workaround<\/a> is available.<\/li>\n<\/ul>\n<pre><code class=\"language-yaml\">default: &amp;default\n  adapter: mysql2\n  encoding: utf8mb4\n  pool: &lt;%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %&gt;\n  port: 4000\n  username: root\n  password:\n  host: 127.0.0.1\n  variables:\n    tidb_enable_noop_functions: ON\n<\/code><\/pre>\n<p>If you configure the database connection using the URI method, the configuration is similar:<\/p>\n<pre><code class=\"language-yaml\">default: &amp;default\n  adapter: mysql2\n  encoding: utf8mb4\n  pool: &lt;%= ENV.fetch(\"RAILS_MAX_THREADS\") { 5 } %&gt;\n  url: &lt;%= ENV.fetch(\"DB_URL\") || \"mysql2:\/\/root:pass@localhost:4000\/myapp\" %&gt;\n  variables:\n    tidb_enable_noop_functions: ON\n<\/code><\/pre>\n<h3>Configure primary key, auto-increment, unique-index<\/h3>\n<p>Create a table named <code>users<\/code>:<\/p>\n<pre><code class=\"language-ruby\">class CreateUsers &lt; ActiveRecord::Migration[6.1]\n  def change\n    create_table :users do |t|\n      t.string :email\n      t.string :password\n      t.string :username\n\n      t.timestamps\n    end\n  end\nend\n<\/code><\/pre>\n<p>Add a unique index:<\/p>\n<pre><code class=\"language-ruby\">class AddUniqueIndexForEmail &lt; ActiveRecord::Migration[6.1]\n  def change\n    add_index :users, :email, unique: true\n  end\nend\n<\/code><\/pre>\n<p>Because TiDB is compatible with MySQL, the usage is almost identical to that of a standalone MySQL database. Compared with other distributed databases that are incompatible in terms of features like primary keys, auto-increment, and unique indexes, TiDB is much more easy to get started with because no extra handling is required.<\/p>\n<p>Now you can take a look at the generated data table:<\/p>\n<pre><code class=\"language-sql\">mysql&gt; show create table users;\n+ -------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+\n| Table | Create Table |\n+-------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+\n| users | CREATE TABLE `users` (\n  `id` bigint(20) NOT NULL AUTO_INCREMENT,\n  `email` varchar(255) DEFAULT NULL,\n  `password` varchar(255) DEFAULT NULL,\n  `username` varchar(255) DEFAULT NULL,\n  `created_at` datetime(6) NOT NULL,\n  `updated_at` datetime(6) NOT NULL,\n  PRIMARY KEY (`id`) \/*T![clustered_index] CLUSTERED *\/,\n  UNIQUE KEY `index_users_on_email` (`email`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30001 |\n+-------+------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------+\n1 row in set (0.01 sec)\n<\/code><\/pre>\n<h3>Add a patch for savepoints<\/h3>\n<p>The only obstacle to combining TiDB and ActiveRecord is that <a href=\"https:\/\/github.com\/pingcap\/tidb\/issues\/6840\">TiDB doesn&#8217;t support savepoints<\/a> for now, so I wrote a simple patch to solve it:<\/p>\n<pre><code class=\"language-ruby\"># https:\/\/github.com\/rails\/rails\/blob\/6-1-stable\/activerecord\/lib\/active_record\/connection_adapters\/abstract\/database_statements.rb#L313\nrequire 'active_record\/connection_adapters\/abstract\/database_statements.rb'\n\nmodule DisableSavepoint\n  def transaction(requires_new: nil, isolation: nil, joinable: true)\n    if requires_new\n      requires_new = nil\n      Rails.logger.warn \"savepoint statement was used, but your db not support, ignored savepoint.\"\n      Rails.logger.warn caller\n      super(requires_new: requires_new, isolation: isolation, joinable: joinable)\n    else\n      super(requires_new: requires_new, isolation: isolation, joinable: joinable)\n    end\n  end\nend\n\nActiveRecord::ConnectionAdapters::DatabaseStatements.send(:prepend, DisableSavepoint)\n<\/code><\/pre>\n<p>In Rails, savepoints are introduced only when the transaction passes <code>true<\/code> to the parameter <code>requires_new<\/code>. When that happens, this patch will change the value of <code>requires_new<\/code> to <code>nil<\/code> and output logs for migration.<\/p>\n<p>From my experience, most Rails projects don&#8217;t use savepoints very often, so migration wouldn&#8217;t be much of a problem if needed. A savepoint is introduced when you perform migration, but if there&#8217;s no concurrent migration, removing it won&#8217;t bring unexpected consequences.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"References\"><\/span>References<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.pingcap.com\/tidb\/stable\/release-5.0.0\">What&#8217;s New in TiDB 5.0<\/a><\/li>\n<li><a href=\"https:\/\/docs.pingcap.com\/tidb\/stable\/mysql-compatibility\">TiDB&#8217;s Compatibility with MySQL<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/hooopo\/rails-tidb\">Source code for rails-tidb Demo<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Integrating a complex ORM like ActiveRecord with TiDB can be difficult. This tutorial helps you get started with TiDB and Rails.<\/p>","protected":false},"author":53,"featured_media":456,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ub_ctt_via":"","footnotes":""},"categories":[18],"tags":[153,29],"class_list":["post-454","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-community","tag-how-to","tag-tutorial"],"acf":[],"featured_image_src":"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg","author_info":{"display_name":"Hooopo","author_link":"https:\/\/www.pingcap.com\/ko\/blog\/author\/hooopo\/"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Getting Started with Rails &amp; TiDB | TiDB<\/title>\n<meta name=\"description\" content=\"Learn about the benefits of TiDB and the TiDB Cloud solutions from PingCAP. Read our latest post &quot;Getting Started with Rails &amp; TiDB&quot; here.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.pingcap.com\/ko\/blog\/getting-started-with-rails-tidb\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Getting Started with Rails &amp; TiDB | TiDB\" \/>\n<meta property=\"og:description\" content=\"Learn about the benefits of TiDB and the TiDB Cloud solutions from PingCAP. Read our latest post &quot;Getting Started with Rails &amp; TiDB&quot; here.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.pingcap.com\/ko\/blog\/getting-started-with-rails-tidb\/\" \/>\n<meta property=\"og:site_name\" content=\"TiDB\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/pingcap2015\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-28T00:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-20T13:41:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2200\" \/>\n\t<meta property=\"og:image:height\" content=\"734\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hooopo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@PingCAP\" \/>\n<meta name=\"twitter:site\" content=\"@PingCAP\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hooopo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/\"},\"author\":{\"name\":\"Hooopo\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/15781a1340ea0b747f5470b262727dba\"},\"headline\":\"Getting Started with Rails &#038; TiDB\",\"datePublished\":\"2021-04-28T00:00:00+00:00\",\"dateModified\":\"2024-08-20T13:41:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/\"},\"wordCount\":562,\"publisher\":{\"@id\":\"https:\/\/www.pingcap.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg\",\"keywords\":[\"How-to\",\"Tutorial\"],\"articleSection\":[\"Community\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/\",\"url\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/\",\"name\":\"Getting Started with Rails & TiDB | TiDB\",\"isPartOf\":{\"@id\":\"https:\/\/www.pingcap.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg\",\"datePublished\":\"2021-04-28T00:00:00+00:00\",\"dateModified\":\"2024-08-20T13:41:42+00:00\",\"description\":\"Learn about the benefits of TiDB and the TiDB Cloud solutions from PingCAP. Read our latest post \\\"Getting Started with Rails & TiDB\\\" here.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage\",\"url\":\"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg\",\"width\":2200,\"height\":734},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.pingcap.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Getting Started with Rails &#038; TiDB\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.pingcap.com\/#website\",\"url\":\"https:\/\/www.pingcap.com\/\",\"name\":\"TiDB\",\"description\":\"TiDB | SQL at Scale\",\"publisher\":{\"@id\":\"https:\/\/www.pingcap.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.pingcap.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.pingcap.com\/#organization\",\"name\":\"PingCAP\",\"url\":\"https:\/\/www.pingcap.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png\",\"width\":811,\"height\":232,\"caption\":\"PingCAP\"},\"image\":{\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/pingcap2015\",\"https:\/\/x.com\/PingCAP\",\"https:\/\/linkedin.com\/company\/pingcap\",\"https:\/\/youtube.com\/channel\/UCuq4puT32DzHKT5rU1IZpIA\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/15781a1340ea0b747f5470b262727dba\",\"name\":\"Hooopo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.pingcap.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/static.pingcap.com\/files\/2022\/10\/17234942\/avatar.jpg\",\"contentUrl\":\"https:\/\/static.pingcap.com\/files\/2022\/10\/17234942\/avatar.jpg\",\"caption\":\"Hooopo\"},\"url\":\"https:\/\/www.pingcap.com\/ko\/blog\/author\/hooopo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Getting Started with Rails & TiDB | TiDB","description":"Learn about the benefits of TiDB and the TiDB Cloud solutions from PingCAP. Read our latest post \"Getting Started with Rails & TiDB\" here.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.pingcap.com\/ko\/blog\/getting-started-with-rails-tidb\/","og_locale":"ko_KR","og_type":"article","og_title":"Getting Started with Rails & TiDB | TiDB","og_description":"Learn about the benefits of TiDB and the TiDB Cloud solutions from PingCAP. Read our latest post \"Getting Started with Rails & TiDB\" here.","og_url":"https:\/\/www.pingcap.com\/ko\/blog\/getting-started-with-rails-tidb\/","og_site_name":"TiDB","article_publisher":"https:\/\/facebook.com\/pingcap2015","article_published_time":"2021-04-28T00:00:00+00:00","article_modified_time":"2024-08-20T13:41:42+00:00","og_image":[{"width":2200,"height":734,"url":"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg","type":"image\/jpeg"}],"author":"Hooopo","twitter_card":"summary_large_image","twitter_creator":"@PingCAP","twitter_site":"@PingCAP","twitter_misc":{"Written by":"Hooopo","Est. reading time":"5\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#article","isPartOf":{"@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/"},"author":{"name":"Hooopo","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/15781a1340ea0b747f5470b262727dba"},"headline":"Getting Started with Rails &#038; TiDB","datePublished":"2021-04-28T00:00:00+00:00","dateModified":"2024-08-20T13:41:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/"},"wordCount":562,"publisher":{"@id":"https:\/\/www.pingcap.com\/#organization"},"image":{"@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage"},"thumbnailUrl":"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg","keywords":["How-to","Tutorial"],"articleSection":["Community"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/","url":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/","name":"Getting Started with Rails & TiDB | TiDB","isPartOf":{"@id":"https:\/\/www.pingcap.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage"},"image":{"@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage"},"thumbnailUrl":"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg","datePublished":"2021-04-28T00:00:00+00:00","dateModified":"2024-08-20T13:41:42+00:00","description":"Learn about the benefits of TiDB and the TiDB Cloud solutions from PingCAP. Read our latest post \"Getting Started with Rails & TiDB\" here.","breadcrumb":{"@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#primaryimage","url":"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg","contentUrl":"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg","width":2200,"height":734},{"@type":"BreadcrumbList","@id":"https:\/\/www.pingcap.com\/blog\/getting-started-with-rails-tidb\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.pingcap.com\/"},{"@type":"ListItem","position":2,"name":"Getting Started with Rails &#038; TiDB"}]},{"@type":"WebSite","@id":"https:\/\/www.pingcap.com\/#website","url":"https:\/\/www.pingcap.com\/","name":"\ud2f0DB","description":"TiDB | SQL at Scale","publisher":{"@id":"https:\/\/www.pingcap.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.pingcap.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.pingcap.com\/#organization","name":"PingCAP","url":"https:\/\/www.pingcap.com\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/","url":"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png","contentUrl":"https:\/\/static.pingcap.com\/files\/2021\/11\/pingcap-logo.png","width":811,"height":232,"caption":"PingCAP"},"image":{"@id":"https:\/\/www.pingcap.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/pingcap2015","https:\/\/x.com\/PingCAP","https:\/\/linkedin.com\/company\/pingcap","https:\/\/youtube.com\/channel\/UCuq4puT32DzHKT5rU1IZpIA"]},{"@type":"Person","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/15781a1340ea0b747f5470b262727dba","name":"Hooopo","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.pingcap.com\/#\/schema\/person\/image\/","url":"https:\/\/static.pingcap.com\/files\/2022\/10\/17234942\/avatar.jpg","contentUrl":"https:\/\/static.pingcap.com\/files\/2022\/10\/17234942\/avatar.jpg","caption":"Hooopo"},"url":"https:\/\/www.pingcap.com\/ko\/blog\/author\/hooopo\/"}]}},"grav_blocks":false,"card_markup":"<a class=\"card-resource bg-white\" href=\"https:\/\/www.pingcap.com\/ko\/blog\/getting-started-with-rails-tidb\/\"><div class=\"card-resource__image-container\"><img class=\"card-resource__image\" alt=\"getting-started-with-rails-tidb.jpg\" src=\"https:\/\/static.pingcap.com\/files\/2021\/04\/getting-started-with-rails-tidb.jpg\" loading=\"lazy\" width=2200 height=734 \/><\/div><div class=\"card-resource__content-container\"><div class=\"card-resource__content-head\"><div class=\"card-resource__category\">Community<\/div><\/div><h5 class=\"card-resource__title\">Getting Started with Rails &#038; TiDB<\/h5><\/div><\/a>","_links":{"self":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/comments?post=454"}],"version-history":[{"count":3,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/454\/revisions"}],"predecessor-version":[{"id":18951,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/posts\/454\/revisions\/18951"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/media\/456"}],"wp:attachment":[{"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/media?parent=454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/categories?post=454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pingcap.com\/ko\/wp-json\/wp\/v2\/tags?post=454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}