{"id":293318,"date":"2022-11-02T15:53:15","date_gmt":"2022-11-02T14:53:15","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=datagrip&#038;p=293318"},"modified":"2025-09-18T10:22:50","modified_gmt":"2025-09-18T09:22:50","slug":"datagrip-2022-3-eap-2-redis-support","status":"publish","type":"datagrip","link":"https:\/\/blog.jetbrains.com\/en\/datagrip\/2022\/11\/02\/datagrip-2022-3-eap-2-redis-support","title":{"rendered":"DataGrip 2022.3 EAP 2: Redis Support"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Summary<\/h1>\n\n\n\n<p>In<a href=\"https:\/\/www.jetbrains.com\/datagrip\/nextversion\" target=\"_blank\" rel=\"noopener\"> DataGrip 2022.3 EAP 2<\/a>, we\u2019ve implemented a preliminary iteration of long-awaited support for Redis. Here is the list of what is now supported:<\/p>\n\n\n\n<ul>\n<li><strong>Connectivity<\/strong>: Redis Single Instance.<\/li>\n\n\n\n<li><strong>Introspection<\/strong>: Introspection of databases and keys, including the ability to set a default key filter for the introspector.<\/li>\n\n\n\n<li><strong>Database Explorer<\/strong>: Separate folders for keys of different types for Redis v6.0+, and one folder with all keys for older versions.<\/li>\n\n\n\n<li><strong>Query Execution<\/strong>: The JDBC driver supports the execution of the majority of queries.<\/li>\n\n\n\n<li><strong>Coding assistance<\/strong>: Code highlighting, keyword completion, and resolution for databases and keys.<\/li>\n\n\n\n<li><strong>Object Editor<\/strong>: Renaming and deleting keys.<\/li>\n\n\n\n<li><strong>Data Viewer<\/strong>: Filtering and JSON highlighting.<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Connectivity<\/h1>\n\n\n\n<p>You can now create simple Redis data sources. To do this, specify the host, port, and default database. You also need to provide a <strong>Default key filter<\/strong> value for the introspector, as you may not want all the keys to be introspected and displayed. The filter should be defined as a regular expression.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"1309\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image.png\" alt=\"\" class=\"wp-image-293323\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Introspection<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Databases<\/strong><\/h3>\n\n\n\n<p>DataGrip gets a list of all of the available databases, so you can check which ones need to be introspected. The number of available databases is set on the server side per user. Usually, this number is 16 by default for a Redis Single instance. The default database is set to &#8216;0&#8217;, but you can reassign it in the connection properties.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"822\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-1.png\" alt=\"\" class=\"wp-image-293334\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Keys<\/strong><\/h3>\n\n\n\n<p>The introspection of keys is performed with a SCAN command. By default, DataGrip sets the COUNT option value to 1000, but you can change this value to adjust the balance between the blocking effect and the speed of the introspection.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1599\" height=\"870\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/Screen-Shot-2022-11-29-at-3.55.02-PM-1.png\" alt=\"\" class=\"wp-image-301773\"\/><\/figure>\n\n\n\n<p><strong>Important for Redis v5.x and older!<\/strong> SCAN only allows you to download lists of keys of different types separately starting with Redis v6. Requesting a type for each key is an extremely resource-intensive operation, given the possible number of keys. So the key type remains unknown after introspection in Redis versions below 6. This leads to some differences between the support available for Redis v6+ and versions below 6.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Database Explorer<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Redis v6+<\/strong><\/h3>\n\n\n\n<p>Database Explorer now displays the keys in your database. Since we know the key types, all of the keys are separated by type.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"669\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-3.png\" alt=\"\" class=\"wp-image-293356\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Redis v5.x and older<\/strong><\/h3>\n\n\n\n<p>Since the key types are unknown, all of the keys are grouped into one folder. The key names are unique regardless of type.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"276\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-4.png\" alt=\"\" class=\"wp-image-293367\"\/><\/figure>\n\n\n\n<p>With the new filtering functionality we <a href=\"https:\/\/blog.jetbrains.com\/en\/datagrip\/2022\/10\/13\/datagrip-2022-3-eap-is-open#Quick_filter\">released in the previous EAP<\/a>, searching for a key is as easy as pie!<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"880\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image.gif\" alt=\"\" class=\"wp-image-293378\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Query execution<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>General<\/strong><\/h3>\n\n\n\n<p>We&#8217;ve implemented our own JDBC driver for Redis. It is based on the open source native <a href=\"https:\/\/github.com\/redis\/jedis\" target=\"_blank\" rel=\"noopener\"><em>Redis Client<\/em><\/a>. Query execution is arranged as follows:<\/p>\n\n\n\n<ul>\n<li><em>Sending a command:<\/em> The client cannot simply send the command text \u2013 it needs it to be split into tokens. This division is implemented inside the JDBC driver.<\/li>\n<\/ul>\n\n\n\n<ul>\n<li><em>Processing the results<\/em>: The client returns lists with arrays of bytes, and depending on the command, this result has to be encoded. After that, the client structures are converted into maps so that DataGrip can display them as JSONs. The top level of these maps is expanded into the table&#8217;s columns.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"1198\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-5.png\" alt=\"\" class=\"wp-image-293389\"\/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote\">\n<p>All native commands are now properly highlighted, but we are adding more to the built-in Redis grammar. If a command is not highlighted (for example, if it\u2019s a renamed command), you can still run it by selecting the statement\u2019s line and invoking the&nbsp;<em>Execute<\/em>&nbsp;action.<\/p>\n<\/blockquote>\n\n\n\n<h1 class=\"wp-block-heading\">Code editing<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Basics<\/strong><\/h3>\n\n\n\n<p>All native commands are now properly highlighted, but we are adding more to the built-in Redis grammar. If a command is not highlighted (for example, if it\u2019s a renamed command), you can still run it by selecting the statement\u2019s line and invoking the&nbsp;<em>Execute<\/em>&nbsp;action.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1471\" height=\"857\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/Renamed-statements-Redis.png\" alt=\"\" class=\"wp-image-301739\"\/><\/figure>\n\n\n\n<p>You can also write single comments with <code>`--`<\/code> symbols.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Code completion and resolution<\/strong><\/h3>\n\n\n\n<p>Code completion for databases and keys now works as expected.<\/p>\n\n\n\n<p>In Redis, keys are created through data modification queries. This means that there should not be unresolved references in these statements. DataGrip doesn\u2019t show unresolved reference warnings for these not-yet-existing objects.<\/p>\n\n\n\n<p>For Redis v6.0 and higher, the type keys relevant to a given context have higher priority.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"628\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-7.png\" alt=\"\" class=\"wp-image-293411\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Object editing<\/h1>\n\n\n\n<p>Databases and keys are two major types of objects in Redis. Here&#8217;s what you can or cannot do with these objects in DataGrip:<\/p>\n\n\n\n<p><strong>Databases:<\/strong> because the number of the databases is defined in the server settings and the names are numbers, you can&#8217;t add, delete, or rename databases.<\/p>\n\n\n\n<p><strong>Keys:<\/strong> they can be deleted and renamed, but it is not possible to create them, since it is impossible to create an empty key.&nbsp;<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Data viewer<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Basics<\/strong><\/h3>\n\n\n\n<p>Key data is read-only, so you cannot edit any data via the UI in DataGrip. But many other important features like paging or filtering are supported in the data viewer. Here is the table of what is supported for each key type:<\/p>\n\n\n\n<figure class=\"wp-block-table\" style=\"font-style:normal;font-weight:100\"><table class=\"has-fixed-layout\"><tbody><tr><td><\/td><td>Retrieve data<\/td><td>Row count<\/td><td>Supports limit page size<\/td><td>Supports offset for paging<\/td><td>Supports filter<\/td><td>Allows sorting by IDE(== not ordered)<\/td><td>Supports sorting by query<\/td><td>Supports reversing<\/td><\/tr><tr><td>String<\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td>N\/A<\/td><td>N\/A<\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><\/tr><tr><td>List<\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color has-black-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#00d084\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><\/tr><tr><td>Set<\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><\/tr><tr><td>Sorted Set<\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><\/tr><tr><td>Hash Table<\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><\/tr><tr><td>Stream<\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#f78da7\" class=\"has-inline-color\">&#8211;<\/mark><\/td><td><mark style=\"background-color:#7bdcb5\" class=\"has-inline-color\">+<\/mark><\/td><\/tr><tr><td><em>Implemented<\/em><\/td><td><strong>Yes<\/strong><\/td><td><strong>Yes<\/strong><\/td><td><strong>Yes<\/strong><\/td><td><strong>Yes<\/strong><\/td><td><strong>Yes<\/strong><\/td><td><strong>No<\/strong><\/td><td><strong>No<\/strong><\/td><td><strong>No<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Data display<\/strong><\/h3>\n\n\n\n<p>The keys of different types are displayed in different ways:<\/p>\n\n\n\n<ul>\n<li><strong>String<\/strong>: A table with one column (value) and one row.<\/li>\n\n\n\n<li><strong>List<\/strong>: A table with one column (value) and one or several rows.<\/li>\n\n\n\n<li><strong>List<\/strong>: A table with one column (value) and one or several rows.<\/li>\n\n\n\n<li><strong>Set<\/strong>:&nbsp; A table with one column (value) and one or several rows.<\/li>\n\n\n\n<li><strong>Sorted Set<\/strong>: A table with two columns (value and score) and one or several rows.<\/li>\n\n\n\n<li><strong>Hash Table<\/strong>: A table with two columns (field and value) and one or several rows.<\/li>\n\n\n\n<li><strong>Stream<\/strong>: A table similar to a document-like collection.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>More details on stream keys<\/strong><\/h3>\n\n\n\n<p>Stream keys are the most complex type of collections in Redis. It was crucial to implement support for them because the most popular <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/12820-redis\" target=\"_blank\" rel=\"noopener\">plugin<\/a> for using Redis in IntelliJ-based IDEs lacks it.<\/p>\n\n\n\n<p>One object in the stream key is the collection of an object ID and a map (many fields with values). This structure is very similar to the collection structure in a MongoDB collection, but with one tiny difference: the object ID is stored &#8220;outside&#8221; of the fields. The vault itself is expanded to several columns on the UI level.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"938\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-8.png\" alt=\"\" class=\"wp-image-293425\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Filtering mechanism<\/strong><\/h3>\n\n\n\n<p>The key data can be filtered and it is implemented via various statements per type. Since there is no explicit <em>WHERE<\/em> clause in Redis statements, the beginning of the statement is written as a prefix in the <em>Filter<\/em> field.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1630\" height=\"500\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/Filter.png\" alt=\"\" class=\"wp-image-293532\"\/><\/figure>\n\n\n\n<p>Here is the list of key types in the following format: &#8216;<em>what should be placed in the filter&#8217; <\/em><em>\u2192 &#8216;what is returned in the data viewer&#8217;.<\/em><\/p>\n\n\n\n<ul>\n<li><strong>String: <\/strong>Not applicable<\/li>\n\n\n\n<li><strong>List:&nbsp; <\/strong><a href=\"https:\/\/redis.io\/commands\/linsert\/\" target=\"_blank\" rel=\"noopener\">LINSERT<\/a> statement \u2013 Index \u2192 Index value.<\/li>\n\n\n\n<li><strong>Set: <\/strong><a href=\"https:\/\/redis.io\/commands\/smismember\/\" target=\"_blank\" rel=\"noopener\">SMISMEMBER<\/a> statement \u2013 The space-divided list of values \u2192 <em>true<\/em> or <em>false<\/em> for each value. <em>False <\/em>is returned for the objects absent in the set.<\/li>\n\n\n\n<li><strong>Sorted Set: <\/strong><a href=\"https:\/\/redis.io\/commands\/zmscore\/\" target=\"_blank\" rel=\"noopener\">ZMSCORE<\/a> statement<strong> <\/strong>\u2013<strong> <\/strong>The space-divided list of values \u2192 <em>score<\/em> or <em>null<\/em> for each value. <em>Null<\/em> is returned for the objects absent in the sorted set.<\/li>\n\n\n\n<li><strong>Hash Table:<\/strong> <a href=\"https:\/\/redis.io\/commands\/hmget\/\" target=\"_blank\" rel=\"noopener\">HMGET<\/a> statement \u2013 The space-divided list of fields \u2192 <em>value<\/em> or <em>null<\/em> for each value. Null is returned for the objects absent in the hash table.<\/li>\n\n\n\n<li><strong>Stream:<\/strong> <a href=\"https:\/\/redis.io\/commands\/xread\/\" target=\"_blank\" rel=\"noopener\">XREAD<\/a> statement \u2013 The start and the end of id range \u2192 the corresponding stream objects<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>JSON value detection<\/strong><\/h3>\n\n\n\n<p>Another feature we that we implemented based on your feedback was the most upvoted DataGrip <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/DBE-283\/Redis-support\" target=\"_blank\" rel=\"noopener\">ticket<\/a> ever:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/c8xrtYDbzVqD94FzisXbXrSMUThs4eY6qn0HFyL6tPIuZj0qU_Clo03eF6q_gK0Lcy-a-8YNcf5pXDEWTeIejIA3B2hbR-0wifKkcgDq0xq3qXBey8kOUSf5Hc564EMl-6E2MiQ1ckAqldEIIasoBh0Mh8LTOUrbRusJpyv6NlSbcN0LoHyf9vOKew.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Redis stores values as strings, and DataGrip automatically detects whether the string values are correct JSONs. If they are, the <em>Value Editor<\/em> (<em>Shift+Enter<\/em>) can display formatted and highlighted JSON:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><\/strong><\/h3>\n\n\n\n<p>This feature can be turned off in the settings:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" loading=\"lazy\" width=\"1600\" height=\"689\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2022\/11\/image-9.png\" alt=\"\" class=\"wp-image-293444\"\/><\/figure>\n\n\n\n<p>That&#8217;s it! We hope that you will try this build and experiment with Redis support. You can download the new build from our <a href=\"https:\/\/www.jetbrains.com\/datagrip\/nextversion\/\" target=\"_blank\" rel=\"noopener\">website<\/a> or via <a href=\"https:\/\/www.jetbrains.com\/toolbox\/app\/?_ga=2.210129361.513033926.1666544740-1403985672.1657716227&amp;_gl=1*1pgqdn3*_ga*MTQwMzk4NTY3Mi4xNjU3NzE2MjI3*_ga_9J976DJZ68*MTY2Njk0NTA3My4xNTYuMS4xNjY2OTQ1MTU5LjguMC4w\" target=\"_blank\" rel=\"noopener\">Toolbox App<\/a>.<\/p>\n\n\n\n<p>There is still time to fix issues before the official release happens in late November, so be sure to let us know if you encounter any problems. Thank you and stay tuned!<\/p>\n","protected":false},"author":395,"featured_media":286953,"comment_status":"closed","ping_status":"closed","template":"","categories":[826,89],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/datagrip\/293318"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/datagrip"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/types\/datagrip"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/users\/395"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/comments?post=293318"}],"version-history":[{"count":10,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/datagrip\/293318\/revisions"}],"predecessor-version":[{"id":628547,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/datagrip\/293318\/revisions\/628547"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/media\/286953"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/media?parent=293318"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/categories?post=293318"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/tags?post=293318"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/en\/wp-json\/wp\/v2\/cross-post-tag?post=293318"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}