{"id":1198,"date":"2021-06-15T09:44:21","date_gmt":"2021-06-15T16:44:21","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/azure-sdk\/?p=1198"},"modified":"2021-09-28T12:43:34","modified_gmt":"2021-09-28T19:43:34","slug":"announcing-the-new-azure-data-tables-libraries","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/azure-sdk\/announcing-the-new-azure-data-tables-libraries\/","title":{"rendered":"Announcing the new Azure Tables Libraries"},"content":{"rendered":"<p>We\u2019re excited to announce that the <a href=\"https:\/\/docs.microsoft.com\/azure\/storage\/tables\/\"><strong>Azure Tables<\/strong><\/a> libraries have been released for .NET, Java, JavaScript\/TypeScript, and Python. The Azure Table service stores NoSQL data in the cloud with a key\/attribute store schema-less design. The Table storage service can be used to store flexible data sets like user data for web applications, address books, device information, or other types of metadata.<\/p>\n<p>The new libraries follow our <a href=\"https:\/\/aka.ms\/azsdk\/guide\">Azure SDK Guidelines<\/a>, making for an idiomatic, consistent, approachable, diagnosable, and dependable library. The new libraries use the language-specific Azure Core packages for handling requests, errors, and credentials.<\/p>\n<p>Note: The Azure Tables libraries are capable of targeting both Azure Storage Table and <a href=\"https:\/\/docs.microsoft.com\/azure\/cosmos-db\/table-introduction\">Azure Cosmos DB Table API<\/a> endpoints.<\/p>\n<h2>SDK Availability<\/h2>\n<p>The Azure Tables libraries can be downloaded from each languages preferred package manager.<\/p>\n<table>\n<thead>\n<tr>\n<th>Language<\/th>\n<th>Package<\/th>\n<th>Command<\/th>\n<th>Project Home<\/th>\n<th>Getting Started<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Python<\/td>\n<td><a href=\"https:\/\/pypi.org\/project\/azure-data-tables\/\">PyPi<\/a><\/td>\n<td><code>pip install azure-data-tables<\/code><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/master\/sdk\/tables\/azure-data-tables\">link<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/master\/sdk\/tables\/azure-data-tables\/#getting-started\">link<\/a><\/td>\n<\/tr>\n<tr>\n<td>.NET<\/td>\n<td><a href=\"https:\/\/www.nuget.org\/packages\/Azure.Data.Tables\/\">NuGet<\/a><\/td>\n<td><code>dotnet add package Azure.Data.Tables<\/code><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/tree\/master\/sdk\/tables\/Azure.Data.Tables\">link<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/tree\/master\/sdk\/tables\/Azure.Data.Tables#getting-started\">link<\/a><\/td>\n<\/tr>\n<tr>\n<td>JavaScript\/TypeScript<\/td>\n<td><a href=\"https:\/\/www.npmjs.com\/package\/@azure\/data-tables\">npm<\/a><\/td>\n<td><code>npm install @azure\/data-tables<\/code><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/master\/sdk\/tables\/data-tables\">link<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/master\/sdk\/tables\/data-tables#getting-started\">link<\/a><\/td>\n<\/tr>\n<tr>\n<td>Java<\/td>\n<td><a href=\"https:\/\/mvnrepository.com\/artifact\/com.azure\/azure-data-tables\">Java<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/master\/sdk\/tables\/azure-data-tables#include-the-package\">Add to POM.xml file<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/master\/sdk\/tables\/azure-data-tables\">link<\/a><\/td>\n<td><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/master\/sdk\/tables\/data-tables#getting-started\">link<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>This blog post assumes you have a working developer environment for your preferred programming language and you already have a Storage or Cosmos Table account. If you do not have those refer to the Getting Started entry in the above table for your preferred programming language. To follow along with these snippets you&#8217;ll need the programming language of your choice (Python, .NET, Java, JS) installed, a text editor, and a Storage or Cosmos Table account.<\/p>\n<p>There will be migration guides added to each project&#8217;s homepage that will show specific examples for updating your code base to the new Azure Tables library discussed in this blog. Links to complete code examples for each language are provided at the end of the <a href=\"#conclusion\">article<\/a>.<\/p>\n<h3>Creating the clients<\/h3>\n<p>There are two clients for interacting with the service. The <code>TableServiceClient<\/code> can be used for account-level interactions (creating tables, setting and getting access policies) and the <code>TableClient<\/code> is used for table-level interactions (create or delete an entity, query or list entities). You can create clients with a key, Shared Access Signature, or using a connection string, all of which can be found in the <a href=\"https:\/\/portal.azure.com\">Azure Portal<\/a>.<\/p>\n<h4>Python<\/h4>\n<pre><code class=\"language-python\">table_client = TableClient.from_connection_string(\"&lt;your-connection-string&gt;\", \"officeSupplies\")\r\ntable_service_client = TableServiceClient.from_connection_String(\"&lt;your-connection-string&gt;\")<\/code><\/pre>\n<h4>.NET<\/h4>\n<pre><code class=\"language-csharp\">TableClient client = new TableClient(\"connectionString\", \"officeSupplies\");\r\nTableServiceClient serviceClient = new TableServiceClient(\"connectionString\");<\/code><\/pre>\n<h4>Java<\/h4>\n<pre><code class=\"language-java\">TableClient tableClient = new TableClientBuilder()\r\n    .connectionString(\"&lt;your-connection-string&gt;\")\r\n    .tableName(\"officeSupplies\")\r\n    .buildClient();<\/code><\/pre>\n<h4>JavaScript<\/h4>\n<pre><code class=\"language-javascript\">const client = TableClient.fromConnectionString(\"&lt;your-connection-string&gt;\", \"officeSupplies\");<\/code><\/pre>\n<h3>Create a table and add an entity to it<\/h3>\n<p>Table names can be any alphanumeric string between 3 and 63 characters. A table can be created from either the <code>TableClient<\/code> or the <code>TableServiceClient<\/code>, the following snippets will show how to create one from a <code>TableClient<\/code>.<\/p>\n<p>An Entity can contain up to 255 properties, with the three system properties of <code>PartitionKey<\/code>, <code>RowKey<\/code>, and <code>Timestamp<\/code>. The first two properties must be provided on all entities and the <code>Timestamp<\/code> property will be modified by the service. For more information, see the <a href=\"https:\/\/docs.microsoft.com\/rest\/api\/storageservices\/understanding-the-table-service-data-model#system-properties\">service documentation<\/a>. Entities can only be inserted and queried from the <code>TableClient<\/code>.<\/p>\n<h4>Python<\/h4>\n<pre><code class=\"language-python\">table_client = TableClient.from_connection_string(\"&lt;your-connection-string&gt;\", \"myTable\")\r\ntable_client.create()\r\n\r\nmy_entity = {\r\n    \"PartitionKey\": \"markers\",\r\n    \"RowKey\": \"id-001\",\r\n    \"Product\": \"Markers\",\r\n    \"Price\": 5.00,\r\n    \"Count\": 10,\r\n    \"Available\": True\r\n}\r\n\r\ntable_client.create_entity(my_entity)<\/code><\/pre>\n<h4>.NET<\/h4>\n<pre><code class=\"language-csharp\">var tableClient = new TableClient(\r\n    new Uri(serviceUri),\r\n    tableName,\r\n    new TableSharedKeyCredential(accountName, storageAccountKey));\r\ntableClient.Create();\r\n\r\nvar partitionKey = \"markers\";\r\nvar rowKey = \"id-001\";\r\nvar entity = new TableEntity(partitionKey, rowKey)\r\n{\r\n    { \"Product\", \"Marker Set\" },\r\n    { \"Price\", 5.00 },\r\n    { \"Quantity\", 21 }\r\n};\r\ntableClient.AddEntity(entity);<\/code><\/pre>\n<h4>Java<\/h4>\n<pre><code class=\"language-java\">TableClient tableClient = new TableClientBuilder()\r\n    .connectionString(\"&lt;your-connection-string&gt;\")\r\n    .tableName(tableName)\r\n    .buildClient();\r\n\r\nString partitionKey = \"markers\";\r\nString rowKey = \"id-001\";\r\nTableEntity entity = new TableEntity(partitionKey, rowKey)\r\n    .addProperty(\"Product\", \"Marker Set\")\r\n    .addProperty(\"Price\", 5.00)\r\n    .addProperty(\"Quantity\", 21);\r\n\r\ntableClient.createEntity(entity);<\/code><\/pre>\n<h4>JavaScript<\/h4>\n<pre><code class=\"language-javascript\">const tableName = \"SampleCreateAndDeleteTable2\";\r\nconst client = TableClient.fromConnectionString(\"&lt;your-connection-string&gt;\", tableName);\r\nawait client.createTable();\r\n\r\nconst entity = {\r\n  partitionKey: \"p1\",\r\n  rowKey: \"r1\",\r\n  date: new Date()\r\n};\r\nawait client.createEntity(entity);<\/code><\/pre>\n<h3>Querying Table Entities<\/h3>\n<p>The <code>TableClient<\/code> allows the user to create custom queries using OData filters. For more information on writing table and entity queries check out the <a href=\"https:\/\/docs.microsoft.com\/rest\/api\/storageservices\/querying-tables-and-entities\">service documentation<\/a>.<\/p>\n<h4>Python<\/h4>\n<pre><code class=\"language-python\">query_filter = \"PartitionKey eq @pk_filter or RowKey eq @rk_filter\"\r\nparameters = {\r\n    \"pk_filter\": \"markers\",\r\n    \"rk_filter\": \"id-001\",\r\n}\r\n\r\nfor entity in table_client.query_entities(query_filter, parameters=parameters):\r\n    print(entity[\"Product\"], entity[\"Count\"])<\/code><\/pre>\n<h4>.NET<\/h4>\n<pre><code class=\"language-csharp\">string MyPK = \"markers\";\r\nstring MyRK = \"id-001\";\r\nstring filter = TableOdataFilter.Create($\"PartitionKey eq {MyPK} or RowKey eq {MyRK}\")\r\n\r\nPageable&lt;TableEntity&gt; entities = tableClient.Query&lt;TableEntity&gt;(filter: filter);\r\n\r\nforeach (TableEntity entity in entities)\r\n{\r\n    Console.WriteLine($\"{entity.GetString(\"Product\")}: {entity.GetInteger(\"Count\")}\");\r\n}<\/code><\/pre>\n<h4>Java<\/h4>\n<pre><code class=\"language-java\">ListEntitiesOptions options = new ListEntitiesOptions()\r\n    .setFilter(\"PartitionKey eq 'markers' or RowKey eq 'id-001'\");\r\n\r\nfor (TableEntity entity : tableClient.listEntities(options)) {\r\n    Map&lt;String, Object&gt; properties = entity.getProperties();\r\n    System.out.println(String.format(\"%s: %d\", properties.get(\"Product\"), properties.get(\"Count\")));\r\n}<\/code><\/pre>\n<h4>JavaScript<\/h4>\n<pre><code class=\"language-javascript\">const partitionKey = \"markers\";\r\nconst id = \"id-001\"\r\nlet entities = client.listEntities({    queryOptions: { filter: odata`PartitionKey eq ${partitionKey} or RowKey eq ${id}` });\r\n\r\nfor await (const entity of entities) {\r\n    console.log(`${entity.Product}: ${entity.Count}`);\r\n}<\/code><\/pre>\n<h3>Batch Transactions<\/h3>\n<p>The Table service allows multiple entity operations (create, delete, update, and upsert) to be made in a single request using transactional batch operations. The transaction is an &#8220;all-or-nothing&#8221; approach, if there is a failure in one of the operations, the entire operation will fail. A transaction can perform any combination of create, delete, update, and upsert operations. For more information, see the <a href=\"https:\/\/docs.microsoft.com\/rest\/api\/storageservices\/performing-entity-group-transactions\">service documentation<\/a>.<\/p>\n<p>Note: All operations within a transaction must target the same partition key.<\/p>\n<h4>Python<\/h4>\n<pre><code class=\"language-python\">table_client = TableClient.from_connection_string(\"&lt;your-connection-string&gt;\", \"myProductTable\")\r\n\r\nentity1 = {\"PartitionKey\": \"pk0001\", \"RowKey\": \"A1\", \"Name\": \"Marker Set\", \"Price\": 5.0, \"Quantity\": 21}\r\nentity2 = {\"PartitionKey\": \"pk0001\", \"RowKey\": \"A2\"}\r\nentity3 = {\"PartitionKey\": \"pk0001\", \"RowKey\": \"A3\", \"Name\": \"Pen Set\", \"Price\": 2.0, \"Quantity\": 6}\r\nentity4 = {\"PartitionKey\": \"pk0001\", \"RowKey\": \"A4\", \"Name\": \"Pencil\", \"Price\": 1.5, \"Quantity\": 100}\r\n\r\noperations = [\r\n    (\"upsert\", entity1),\r\n    (\"delete\", entity2),\r\n    (\"create\", entity3),\r\n    (\"update\", entity4, {\"mode\": \"replace\"})\r\n]\r\n\r\ntable_client.submit_transaction(operations)<\/code><\/pre>\n<h4>.NET<\/h4>\n<pre><code class=\"language-csharp\">var tableClient = new TableClient(\r\n    new Uri(serviceUri),\r\n    tableName,\r\n    new TableSharedKeyCredential(accountName, storageAccountKey));\r\n\r\nstring partitionKey = \"BatchInsertSample\";\r\nList&lt;TableEntity&gt; entityList = new List&lt;TableEntity&gt;\r\n{\r\n    new TableEntity(partitionKey, \"01\")\r\n    {\r\n        { \"Product\", \"Marker\" },\r\n        { \"Price\", 5.00 },\r\n        { \"Brand\", \"Premium\" }\r\n    },\r\n    new TableEntity(partitionKey, \"02\")\r\n    {\r\n        { \"Product\", \"Pen\" },\r\n        { \"Price\", 3.00 },\r\n        { \"Brand\", \"Premium\" }\r\n    },\r\n    new TableEntity(partitionKey, \"03\")\r\n    {\r\n        { \"Product\", \"Paper\" },\r\n        { \"Price\", 0.10 },\r\n        { \"Brand\", \"Premium\" }\r\n    },\r\n    new TableEntity(partitionKey, \"04\")\r\n    {\r\n        { \"Product\", \"Glue\" },\r\n        { \"Price\", 1.00 },\r\n        { \"Brand\", \"Generic\" }\r\n    },\r\n};\r\n\r\n\/\/ Create the batch.\r\nList&lt;TableTransactionAction&gt; addEntitiesBatch = new List&lt;TableTransactionAction&gt;();\r\n\r\n\/\/ Add the entities to be added to the batch.\r\naddEntitiesBatch.AddRange(entityList.Select(e =&gt; new TableTransactionAction(TableTransactionActionType.Add, e)));\r\n\r\n\/\/ Submit the batch.\r\nResponse&lt;IReadOnlyList&lt;Response&gt;&gt; response = await client.SubmitTransactionAsync(addEntitiesBatch).ConfigureAwait(false);\r\n\r\nfor (int i = 0; i &lt; entityList.Count; i++)\r\n{\r\n    Console.WriteLine($\"The ETag for the entity with RowKey: '{entityList[i].RowKey}' is {response.Value[i].Headers.ETag}\");\r\n}<\/code><\/pre>\n<h4>Java<\/h4>\n<pre><code class=\"language-java\">TableClient tableClient = new TableClientBuilder()\r\n    .tableName(\"myProductTable\")\r\n    .connectionString(\"&lt;your-connection-string&gt;\")\r\n    .buildClient();\r\n\r\n\/\/ Now let's create a list to add transactional batch actions to.\r\nList&lt;TableTransactionAction&gt; transactionActions = new ArrayList&lt;&gt;();\r\n\r\nString partitionKey = \"pk001\";\r\n\r\nTableEntity firstEntity = new TableEntity(partitionKey, \"rk001\")\r\n    .addProperty(\"Name\", \"Marker Set\")\r\n    .addProperty(\"Price\", 5.0)\r\n    .addProperty(\"Quantity\", 21);\r\n\r\nTableEntity secondEntity = new TableEntity(partitionKey, \"rk002\")\r\n    .addProperty(\"Brand\", \"Crayola\")\r\n    .addProperty(\"Color\", \"Blue\");\r\n\r\nTableEntity entityToUpdate = new TableEntity(partitionKey, \"rk003\")\r\n    .addProperty(\"Brand\", \"Crayola\")\r\n    .addProperty(\"Color\", \"Red\");\r\n\r\nTableEntity entityToDelete = new TableEntity(partitionKey, \"rk004\")\r\n    .addProperty(\"Brand\", \"Crayola\")\r\n    .addProperty(\"Color\", \"Green\");\r\n\r\ntransactionActions.add(new TableTransactionAction(TableTransactionActionType.CREATE, firstEntity));\r\ntransactionActions.add(new TableTransactionAction(TableTransactionActionType.CREATE, secondEntity));\r\ntransactionActions.add(new TableTransactionAction(TableTransactionActionType.UPDATE_MERGE, entityToUpdate));\r\ntransactionActions.add(new TableTransactionAction(TableTransactionActionType.DELETE, entityToDelete));\r\n\r\nTableTransactionResult tableTransactionResult = tableClient.submitTransaction(transactionActions);<\/code><\/pre>\n<h4>JavaScript<\/h4>\n<pre><code class=\"language-javascript\">\/\/ See authenticationMethods sample for other options of creating a new client\r\nconst client = TableClient.fromConnectionString(\"&lt;your-connection-string&gt;\", \"tableName\");\r\nconst partitionKey = \"Stationery\";\r\n\r\n\/\/ Create a transaction\r\nconst transaction = new TableTransaction();\r\n\r\n\/\/ Add actions to the transaction\r\ntransaction.createEntity({\r\n  partitionKey,\r\n  rowKey: \"A1\",\r\n  name: \"Marker Set\",\r\n  price: 5.0,\r\n  quantity: 21\r\n});\r\ntransaction.createEntity({\r\n  partitionKey,\r\n  rowKey: \"A2\",\r\n  name: \"Pen Set\",\r\n  price: 2.0,\r\n  quantity: 6\r\n});\r\ntransaction.createEntity({\r\n  partitionKey,\r\n  rowKey: \"A3\",\r\n  name: \"Pencil\",\r\n  price: 1.5,\r\n  quantity: 100\r\n});\r\n\r\n\/\/ Submit the transaction using the actions list built by the helper\r\nconst transactionResult = await client.submitTransaction(transaction.actions);<\/code><\/pre>\n<h2>Conclusion<\/h2>\n<p>We hope this was a valuable technical introduction to <code>Azure Tables<\/code> and what you can use today to build and ship rich experiences.<\/p>\n<p>If you want to learn more and get started, here are some quick links to our official documentation:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/tree\/master\/sdk\/tables\">.NET documentation<\/a> and <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-net\/tree\/main\/sdk\/tables\/Azure.Data.Tables\/samples\">.NET samples<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/master\/sdk\/tables\">Java documentation<\/a> and <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/tree\/main\/sdk\/tables\/azure-data-tables\/src\/samples\">Java samples<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/master\/sdk\/tables\">JavaScript\/TypeScript documentation<\/a>, <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/main\/sdk\/tables\/data-tables\/samples\/v12\/javascript\">JS samples<\/a>, and <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-js\/tree\/main\/sdk\/tables\/data-tables\/samples\/v12\/typescript\">TS samples<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/master\/sdk\/tables\">Python documentation<\/a> and <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-python\/tree\/main\/sdk\/tables\/azure-data-tables\/samples\">Python samples<\/a><\/li>\n<\/ul>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/storage\/tables\/\">Official Azure Tables documentation<\/a><\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/storage\/tables\/table-storage-quickstart-portal\">Create your Tables resources Quickstart<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --><\/p>\n<p><div  class=\"d-flex justify-content-center\"><a class=\"cta_button_link btn-primary mb-24\" href=\"https:\/\/aka.ms\/azsdk\/releases\" target=\"_blank\">Azure SDK Releases<\/a><\/div><\/p>\n<h2>Azure SDK Blog Contributions<\/h2>\n<p>Thank you for reading this Azure SDK blog post! We hope that you learned something new and welcome you to share this post. We are open to Azure SDK blog contributions. Please contact us at <a href=\"mailto:azsdkblog@microsoft.com\">azsdkblog@microsoft.com<\/a> with your topic and we&#8217;ll get you set up as a guest blogger.<\/p>\n<h2>Azure SDK Links<\/h2>\n<ul>\n<li>Azure SDK Website: <a href=\"https:\/\/aka.ms\/azsdk\">aka.ms\/azsdk<\/a><\/li>\n<li>Azure SDK Intro (3 minute video): <a href=\"https:\/\/aka.ms\/azsdk\/intro\">aka.ms\/azsdk\/intro<\/a><\/li>\n<li>Azure SDK Intro Deck (PowerPoint deck): <a href=\"https:\/\/aka.ms\/azsdk\/intro\/deck\">aka.ms\/azsdk\/intro\/deck<\/a><\/li>\n<li>Azure SDK Releases: <a href=\"https:\/\/aka.ms\/azsdk\/releases\">aka.ms\/azsdk\/releases<\/a><\/li>\n<li>Azure SDK Blog: <a href=\"https:\/\/aka.ms\/azsdk\/blog\">aka.ms\/azsdk\/blog<\/a><\/li>\n<li>Azure SDK Twitter: <a href=\"https:\/\/twitter.com\/AzureSDK\">twitter.com\/AzureSDK<\/a><\/li>\n<li>Azure SDK Design Guidelines: <a href=\"https:\/\/aka.ms\/azsdk\/guide\">aka.ms\/azsdk\/guide<\/a><\/li>\n<li>Azure SDKs &amp; Tools: <a href=\"https:\/\/azure.microsoft.com\/downloads\">azure.microsoft.com\/downloads<\/a><\/li>\n<li>Azure SDK Central Repository: <a href=\"https:\/\/github.com\/azure\/azure-sdk#azure-sdk\">github.com\/azure\/azure-sdk<\/a><\/li>\n<li>Azure SDK for .NET: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-net\">github.com\/azure\/azure-sdk-for-net<\/a><\/li>\n<li>Azure SDK for Java: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-java\">github.com\/azure\/azure-sdk-for-java<\/a><\/li>\n<li>Azure SDK for Python: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-python\">github.com\/azure\/azure-sdk-for-python<\/a><\/li>\n<li>Azure SDK for JavaScript\/TypeScript: <a href=\"https:\/\/github.com\/azure\/azure-sdk-for-js\">github.com\/azure\/azure-sdk-for-js<\/a><\/li>\n<li>Azure SDK for Android: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-android\">github.com\/Azure\/azure-sdk-for-android<\/a><\/li>\n<li>Azure SDK for iOS: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-ios\">github.com\/Azure\/azure-sdk-for-ios<\/a><\/li>\n<li>Azure SDK for Go: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-go\">github.com\/Azure\/azure-sdk-for-go<\/a><\/li>\n<li>Azure SDK for C: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-c\">github.com\/Azure\/azure-sdk-for-c<\/a><\/li>\n<li>Azure SDK for C++: <a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-cpp\">github.com\/Azure\/azure-sdk-for-cpp<\/a><\/li>\n<\/ul>\n<p><!-- FOOTER: DO NOT EDIT OR REMOVE --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post, we&#8217;ll announce that the new Azure Tables libraries have been released.<\/p>\n","protected":false},"author":63249,"featured_media":1195,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[701,750,160,159,162,732,746,733],"class_list":["post-1198","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure-sdk","tag-net","tag-azure-sdk","tag-java","tag-javascript","tag-python","tag-release","tag-tables","tag-typescript"],"acf":[],"blog_post_summary":"<p>In this post, we&#8217;ll announce that the new Azure Tables libraries have been released.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/1198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/users\/63249"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/comments?post=1198"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/posts\/1198\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media\/1195"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/media?parent=1198"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/categories?post=1198"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/azure-sdk\/wp-json\/wp\/v2\/tags?post=1198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}