{"id":147,"date":"2020-06-16T05:59:32","date_gmt":"2020-06-16T12:59:32","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sql\/?p=147"},"modified":"2022-06-28T06:17:41","modified_gmt":"2022-06-28T13:17:41","slug":"go-azure-sql","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sql\/go-azure-sql\/","title":{"rendered":"Go Azure SQL!"},"content":{"rendered":"<p>Pardon the pun in title here, but the goal for this post is to introduce how to start interacting with Azure SQL through Go (<a href=\"https:\/\/golang.org\/\">https:\/\/golang.org\/<\/a>), an open source programming language gaining lots of traction in developers\u2019 community thanks to its simplicity and efficiency in scenarios like microservices and server apps (did I mention that Kubernetes itself is written in Go?).<\/p>\n<p>Azure SQL provides full support for Go developers on both control plane (deploy, manage and configure Azure SQL servers and databases), and data plane activities (connect, execute commands and queries against Azure SQL instances) through\u00a0<a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-go\">Azure SDK for Go<\/a>\u00a0and\u00a0<a href=\"https:\/\/github.com\/denisenkom\/go-mssqldb\">Microsoft SQL Server Driver for Go<\/a>.<\/p>\n<p>A companion code sample for this article, written using VS Code, can be found\u00a0<a href=\"https:\/\/github.com\/scoriani\/GoAzureSQL\">here<\/a>.<\/p>\n<h3>Management Operations<\/h3>\n<p>To deploy and configure a brand-new Azure SQL server from your own code, you can use one of the various SDKs available in Azure. For Go language,\u00a0<a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/go\/\">Azure SDK<\/a>\u00a0provides a collection of packages that can be used to interact with various resource types you need (e.g. generic resources like Resource Groups, Azure SQL, authentication mechanisms, etc.). Most important ones to import are:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-14.59.54.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1357\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-14.59.54.png\" alt=\"Image Screenshot 2022 06 28 at 14 59 54\" width=\"908\" height=\"113\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-14.59.54.png 908w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-14.59.54-300x37.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-14.59.54-768x96.png 768w\" sizes=\"(max-width: 908px) 100vw, 908px\" \/><\/a><\/p>\n<p><img decoding=\"async\" title=\"\" src=\"https:\/\/www.pass.org\/Portals\/0\/Images\/PASS%20Insights\/PASS%20Insights%20Dev%2002262020\/Dev-Insights-02252020-1.png?ver=2020-02-25-134207-093\" alt=\"\" \/>Notice that in the first row, we are using an alias for the sql package as name is conflicting with the database\/sql package we\u2019ll use later in our data access code.<\/p>\n<p>Before being able to interact with Azure Resource Management (ARM) APIs, we need to retrieve a token that will be used to authenticate and authorise our operations.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.10-1.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1359\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.10-1.png\" alt=\"Image Screenshot 2022 06 28 at 15 00 10\" width=\"963\" height=\"53\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.10-1.png 963w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.10-1-300x17.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.10-1-768x42.png 768w\" sizes=\"(max-width: 963px) 100vw, 963px\" \/><\/a><\/p>\n<p>Next is to create a client for the specific task required, for example creating a new Azure SQL server and pass the token to it:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.21.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1360\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.21.png\" alt=\"Image Screenshot 2022 06 28 at 15 00 21\" width=\"447\" height=\"71\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.21.png 447w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.21-300x48.png 300w\" sizes=\"(max-width: 447px) 100vw, 447px\" \/><\/a><\/p>\n<p>Then we can call the CreateOrUpdate() method passing all the required parameters like location, admin credentials and so on:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.34.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1361\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.34.png\" alt=\"Image Screenshot 2022 06 28 at 15 00 34\" width=\"667\" height=\"318\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.34.png 667w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.34-300x143.png 300w\" sizes=\"(max-width: 667px) 100vw, 667px\" \/><\/a><\/p>\n<p>It\u2019s important to remember that ARM APIs are asynchronous in nature. That\u2019s why in Go SDK to check for completion of long running operations a future is returned, and in our code we can wait until the operation is finished before proceeding with other steps:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.46.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1362\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.46.png\" alt=\"Image Screenshot 2022 06 28 at 15 00 46\" width=\"575\" height=\"57\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.46.png 575w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.00.46-300x30.png 300w\" sizes=\"(max-width: 575px) 100vw, 575px\" \/><\/a><img decoding=\"async\" title=\"\" src=\"https:\/\/www.pass.org\/Portals\/0\/Images\/PASS%20Insights\/PASS%20Insights%20Dev%2002262020\/Dev-Insights-02252020-5.png?ver=2020-02-25-134207-093\" alt=\"\" \/><\/p>\n<p>In can apply the same exact pattern to all other management operations, like creating a new database or configuring specific capabilities like replication or security.<\/p>\n<h3>Data Access Layer<\/h3>\n<p>Let\u2019s move to proper data access code! Like in many other programming languages, we have two main options when interacting with our databases: through direct SQL commands or by using an Object Relational Mapper (ORM).<\/p>\n<p>Microsoft SQL Server Driver for Go can be added to our code project by importing the\u00a0&#8220;github.com\/denisenkom\/go-mssqldb&#8221; package (in addition to standard &#8220;database\/sql&#8221; for database interfaces).<\/p>\n<p>Opening a database connection is similar to what we would do in any other programming language, by invoking Open() method passing a connection string and getting back a reference.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.06.54.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1363\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.06.54.png\" alt=\"Image Screenshot 2022 06 28 at 15 06 54\" width=\"951\" height=\"279\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.06.54.png 951w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.06.54-300x88.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.06.54-768x225.png 768w\" sizes=\"(max-width: 951px) 100vw, 951px\" \/><\/a><\/p>\n<p>Executing a query is also straightforward and can be done through the QueryXXX() methods, depending if returning one or more rows and\/or results-ets. Notice proper usage of sql.Named() \u00a0for named parameters:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.08.30.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1364\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.08.30.png\" alt=\"Image Screenshot 2022 06 28 at 15 08 30\" width=\"855\" height=\"464\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.08.30.png 855w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.08.30-300x163.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.08.30-768x417.png 768w\" sizes=\"(max-width: 855px) 100vw, 855px\" \/><\/a><\/p>\n<p>Iterating through results with rows.Next() \u00a0is equally very familiar. In the following code fragment we are assigning values of individual columns in the result sets to variables:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.10.32-1.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1367\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.10.32-1.png\" alt=\"Image Screenshot 2022 06 28 at 15 10 32\" width=\"1025\" height=\"433\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.10.32-1.png 1025w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.10.32-1-300x127.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.10.32-1-768x324.png 768w\" sizes=\"(max-width: 1025px) 100vw, 1025px\" \/><\/a><\/p>\n<p>In use cases where you need to execute multiple times the same command, but passing different sets of parameters, a common best practice is to call db.Prepare(tsql) and create a prepared statement, so that for every following execution you will force reuse of the compiled execution plan for a more efficient interaction with the database. In the following code fragment, you can see a practical implementation:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.12.04.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1368\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.12.04.png\" alt=\"Image Screenshot 2022 06 28 at 15 12 04\" width=\"818\" height=\"653\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.12.04.png 818w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.12.04-300x239.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.12.04-768x613.png 768w\" sizes=\"(max-width: 818px) 100vw, 818px\" \/><\/a><\/p>\n<h3>Use an Object Relational Mapper (ORM)<\/h3>\n<p>ORMs are packages designed to let developers interact with their relational databases through an object oriented paradigm. In essence, we have to define some basic mapping rules between application\u2019s objects and database tables, and these libraries will read or persist instances of our objects as rows in database tables. One of the most commonly used in Go space is called\u00a0<a href=\"https:\/\/gorm.io\/\">Gorm<\/a>.<\/p>\n<p>First step is to declare types used in our application logic to contain entities to extract or persist in our database structure. In the following example, we can see how specific tags can be used to let Gorm know how to treat specific columns, like data types to use, column names and constrains like primary keys and such. We can also create \u201caliases\u201d for object names pointing to database tables with different names using TableName() functions.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.13.14.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1369\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.13.14.png\" alt=\"Image Screenshot 2022 06 28 at 15 13 14\" width=\"557\" height=\"676\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.13.14.png 557w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.13.14-247x300.png 247w\" sizes=\"(max-width: 557px) 100vw, 557px\" \/><\/a><\/p>\n<p>Next step is to open connection with the database, in a way very similar to what you\u2019d do with a regular database driver:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.12.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1370\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.12.png\" alt=\"Image Screenshot 2022 06 28 at 15 14 12\" width=\"827\" height=\"171\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.12.png 827w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.12-300x62.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.12-768x159.png 768w\" sizes=\"(max-width: 827px) 100vw, 827px\" \/><\/a><\/p>\n<p>Query database to extract a single entity is than quite natural, and we don\u2019t need to specify any T-SQL command for that, but rather invoke the Where() method passing our predicate as parameter:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.53.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1371\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.53.png\" alt=\"Image Screenshot 2022 06 28 at 15 14 53\" width=\"714\" height=\"143\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.53.png 714w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.14.53-300x60.png 300w\" sizes=\"(max-width: 714px) 100vw, 714px\" \/><\/a><\/p>\n<p>Other CRUD operations are equally similar:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.15.40.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1372\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.15.40.png\" alt=\"Image Screenshot 2022 06 28 at 15 15 40\" width=\"754\" height=\"370\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.15.40.png 754w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.15.40-300x147.png 300w\" sizes=\"(max-width: 754px) 100vw, 754px\" \/><\/a><\/p>\n<p>We can also create queries that joins multiple entities and project results into new object structures in your application logic, again in a very natural way:<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.16.57.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-1373\" src=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.16.57.png\" alt=\"Image Screenshot 2022 06 28 at 15 16 57\" width=\"1091\" height=\"583\" srcset=\"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.16.57.png 1091w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.16.57-300x160.png 300w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.16.57-1024x547.png 1024w, https:\/\/devblogs.microsoft.com\/azure-sql\/wp-content\/uploads\/sites\/56\/2020\/06\/Screenshot-2022-06-28-at-15.16.57-768x410.png 768w\" sizes=\"(max-width: 1091px) 100vw, 1091px\" \/><\/a><img decoding=\"async\" title=\"\" src=\"https:\/\/www.pass.org\/Portals\/0\/Images\/PASS%20Insights\/PASS%20Insights%20Dev%2002262020\/Dev-Insights-02252020-14.png?ver=2020-02-25-134207-093\" alt=\"\" \/><\/p>\n<h3>In summary<\/h3>\n<p>Go is a very popular programming language for developing microservices, Web APIs and other server-side applications, and Azure SQL can definitely be an option where to persist data for these applications in a scalable, reliable and modern way leveraging Microsoft SQL Server Driver for Go and ORM packages like Gorm. Give it a try!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Go is a very popular programming language for developing microservices, Web APIs and other server-side applications, and Azure SQL can definitely be an option where to persist data for these applications in a scalable, reliable and modern way leveraging Microsoft SQL Server Driver for Go and ORM packages like Gorm. Give it a try!<\/p>\n","protected":false},"author":32624,"featured_media":81,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[30,169,170,171],"class_list":["post-147","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sql","tag-developers","tag-golang","tag-management-api","tag-orm"],"acf":[],"blog_post_summary":"<p>Go is a very popular programming language for developing microservices, Web APIs and other server-side applications, and Azure SQL can definitely be an option where to persist data for these applications in a scalable, reliable and modern way leveraging Microsoft SQL Server Driver for Go and ORM packages like Gorm. Give it a try!<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/posts\/147","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/users\/32624"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/comments?post=147"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/posts\/147\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/media\/81"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/media?parent=147"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/categories?post=147"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sql\/wp-json\/wp\/v2\/tags?post=147"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}