<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abhiman Tiwari</title>
    <description>The latest articles on DEV Community by Abhiman Tiwari (@abhimantiwari).</description>
    <link>https://dev.to/abhimantiwari</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F799983%2F8b9fac34-8442-4474-9ed8-643f70dfd6ca.jpeg</url>
      <title>DEV Community: Abhiman Tiwari</title>
      <link>https://dev.to/abhimantiwari</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhimantiwari"/>
    <language>en</language>
    <item>
      <title>Create REST API in Python with Django, using the Django REST Framework and Azure SQL</title>
      <dc:creator>Abhiman Tiwari</dc:creator>
      <pubDate>Thu, 03 Mar 2022 12:44:20 +0000</pubDate>
      <link>https://dev.to/azure/create-rest-api-in-python-with-django-using-the-django-rest-framework-and-azure-sql-e1l</link>
      <guid>https://dev.to/azure/create-rest-api-in-python-with-django-using-the-django-rest-framework-and-azure-sql-e1l</guid>
      <description>&lt;p&gt;Django is a Python-based open-source web framework. It is a popular and well-liked web framework among developers all around the world. But wouldn’t it be amazing to build a website with Django while also taking advantage of Azure SQL database’s security, performance, high availability, and other &lt;a href="https://techcommunity.microsoft.com/t5/azure-sql-blog/10-reasons-why-azure-sql-is-the-best-database-for-developers/ba-p/969055"&gt;great capabilities&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;In this article, we will create a REST API in Python with Django, using the Django REST Framework and Azure SQL database that allows you to perform CRUD operations. Along the way, I will also show you how you can deploy your Django-based app on Azure app service.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/microsoft/mssql-django"&gt;mssql-django&lt;/a&gt; is a fork of &lt;a href="https://pypi.org/project/django-mssql-backend/"&gt;django-mssql-backend&lt;/a&gt;. This driver provides an enterprise database connectivity option for the Django Web Framework, with support for Microsoft SQL Server and Azure SQL Database.&lt;br&gt;
&lt;a href="https://github.com/microsoft/mssql-django"&gt;mssql-django&lt;/a&gt; supports Django 2.2, 3.0, 3.1, 3.2 and 4.0.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Download the sample code
&lt;/h2&gt;

&lt;p&gt;Clone this repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/azure-samples/azure-sql-db-django
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can clone the code using Visual Studio Code as well.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the folder location where you want to clone the code&lt;/li&gt;
&lt;li&gt;In Visual Studio Code, select Source Control &amp;gt; ... &amp;gt; Clone (or select View, Command Palette and enter Git:Clone), paste the &lt;a href="https://github.com/azure-samples/azure-sql-db-django.git"&gt;Git repository URL&lt;/a&gt;, and then select Enter&amp;lt;/&amp;gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you have the code downloaded to your local computer. You should see folder structure as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;azure-sql-db-django&lt;/span&gt;
 &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;customerapi&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;migrations&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;admin.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;apps.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;models.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;serializers.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;tests.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;urls.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;views.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┗&lt;/span&gt; &lt;span class="err"&gt;__init__.py&lt;/span&gt;
 &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;django-sql-project&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;asgi.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;settings.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;urls.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;wsgi.py&lt;/span&gt;
 &lt;span class="err"&gt;┃&lt;/span&gt; &lt;span class="err"&gt;┗&lt;/span&gt; &lt;span class="err"&gt;__init__.py&lt;/span&gt;
 &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;LICENSE&lt;/span&gt;
 &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;manage.py&lt;/span&gt;
 &lt;span class="err"&gt;┣&lt;/span&gt; &lt;span class="err"&gt;README.md&lt;/span&gt;
 &lt;span class="err"&gt;┗&lt;/span&gt; &lt;span class="err"&gt;requirements.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create Azure SQL Database
&lt;/h2&gt;

&lt;p&gt;If you don't have an Azure SQL server already, you can create one (no additional costs for a server) by running the following &lt;a href="https://docs.microsoft.com/en-us/cli/azure/"&gt;AZ CLI&lt;/a&gt; command (via &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/"&gt;WSL&lt;/a&gt;, or Linux or &lt;a href="https://azure.microsoft.com/en-us/features/cloud-shell/"&gt;Azure Cloud Shell&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;Create a resource group if you don't have one already created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az group create -l &amp;lt;location&amp;gt; -n &amp;lt;MyResourceGroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the Database Server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az sql server create -n &amp;lt;server-name&amp;gt; -l &amp;lt;location&amp;gt; --admin-user &amp;lt;admin-user&amp;gt; --admin-password &amp;lt;admin-password&amp;gt; -g &amp;lt;resource-group&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Make sure to note the database name, username and password somewhere safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Create a new Azure SQL database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az sql db create -g &amp;lt;resource-group&amp;gt; -s &amp;lt;server-name&amp;gt; -n my-db --service-objective GP_Gen5_2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure you have the firewall configured to allow your machine to access Azure SQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az sql server firewall-rule create --resource-group &amp;lt;resource-group&amp;gt; --server &amp;lt;server-name&amp;gt; --name AllowMyClientIP_1 --start-ip-address &amp;lt;your_public_ip&amp;gt; --end-ip-address &amp;lt;your_public_ip&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can get your public IP &lt;a href="https://ipinfo.io/ip"&gt;here&lt;/a&gt; or through other ways, for example: &lt;a href="https://ifconfig.me/"&gt;https://ifconfig.me/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup the local environment
&lt;/h2&gt;

&lt;p&gt;Make sure you have &lt;a href="https://www.python.org/"&gt;Python&lt;/a&gt; =&amp;gt; 3.8.10 installed on your machine.&lt;/p&gt;

&lt;p&gt;To confirm you can run &lt;code&gt;python&lt;/code&gt; or &lt;code&gt;python3&lt;/code&gt; on terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;All the commands shown here are for Windows. If you are working on any other OS/ environment e.g. Linux, MAC etc. change these commands accordingly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Make sure you have &lt;a href="https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/"&gt;venv&lt;/a&gt; installed and create a new virtual environment in the folder where you have cloned the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv &lt;span class="nb"&gt;env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;In the above command the second parameter &lt;code&gt;env&lt;/code&gt; is the location to create virtual environment.\&lt;br&gt;
&lt;code&gt;venv&lt;/code&gt; will create a virtual Python installation in the &lt;code&gt;env&lt;/code&gt; folder.\&lt;br&gt;
You should exclude your virtual environment directory from your version control system using &lt;code&gt;.gitignore&lt;/code&gt; or similar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before you start installing or using Django packages in your virtual environment, you'll need to &lt;a href="https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#activating-a-virtual-environment"&gt;activate it&lt;/a&gt;, for example on Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;.&lt;span class="se"&gt;\e&lt;/span&gt;nv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;You can confirm, you’re in the virtual environment by checking the location of your Python interpreter. It should be in the &lt;code&gt;env&lt;/code&gt; directory.&lt;/p&gt;


&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;where&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;As long as your virtual environment is activated, &lt;code&gt;pip&lt;/code&gt; will install packages into that specific environment and you’ll be able to import and use packages in your Python application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Install the dependencies
&lt;/h2&gt;

&lt;p&gt;Make sure virtual environment is active and you are into your &lt;code&gt;&amp;lt;working_folder&amp;gt;\azure-sql-db-django&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can install all the required packages in one go by running the below command and directly move to Database ConnectionString &lt;strong&gt;Configuration&lt;/strong&gt; section or may follow the instructions to execute them one by one:&lt;/p&gt;


&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Install &lt;a href="https://www.djangoproject.com/download/"&gt;Django&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, install &lt;a&gt;Django REST framework&lt;/a&gt; for REST API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;djangorestframework&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should also install &lt;a href="https://pypi.org/project/django-cors-headers/"&gt;django-cors-headers&lt;/a&gt;. It's a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cors&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Adding &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS"&gt;CORS&lt;/a&gt; headers allows your resources to be accessed on other domains. It’s important you understand the implications before adding the headers since you could be unintentionally opening up your site’s private data to others.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configure Azure SQL connectivity with Django App
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dependencies
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;pyodbc 3.0 or newer&lt;/li&gt;
&lt;li&gt;Microsoft SQL Server ODBC driver&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install ODBC driver: &lt;a href="https://docs.microsoft.com/en-us/sql/connect/odbc/microsoft-odbc-driver-for-sql-server?view=sql-server-ver15"&gt;Instructions&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install pyodbc:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;pyodbc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install mssql-django:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;mssql&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Configuration
&lt;/h3&gt;

&lt;p&gt;Configure the Database ConnectionString in the &lt;code&gt;settings.py&lt;/code&gt; file used by your Django project to use &lt;code&gt;mssql&lt;/code&gt; and the related ODBC driver.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;'ENGINE'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'mssql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'PORT'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'1433'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'OPTIONS'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="s1"&gt;'driver'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ODBC Driver 17 for SQL Server'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To connect Azure SQL DB using MSI (Managed Service Identity), you can have settings as below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;'default'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="s1"&gt;'ENGINE'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'mssql'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="s1"&gt;'Trusted_Connection'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'no'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
         &lt;span class="s1"&gt;'OPTIONS'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
             &lt;span class="s1"&gt;'driver'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'ODBC Driver 17 for SQL Server'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
             &lt;span class="s1"&gt;'extra_params'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;"Authentication=ActiveDirectoryMsi;Encrypt=yes;TrustServerCertificate=no"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please note that for this sample we decided to avoid having secrets in the &lt;code&gt;settings.py&lt;/code&gt; file. All sensitive details will be loaded from environment variables. For development purposes you can create an &lt;code&gt;.env&lt;/code&gt; file, using the provided &lt;code&gt;.env.sample&lt;/code&gt;, to provide database connection info.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/microsoft/mssql-django"&gt;mssql-django&lt;/a&gt; doesn't support using time zones yet, so the recommendation is to ensure the &lt;code&gt;USE_TZ&lt;/code&gt; option is set to &lt;code&gt;False&lt;/code&gt;.&lt;/p&gt;


&lt;pre class="highlight sql"&gt;&lt;code&gt;
&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="k"&gt;to&lt;/span&gt; &lt;span class="k"&gt;False&lt;/span&gt; &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt; &lt;span class="n"&gt;zones&lt;/span&gt;
&lt;span class="n"&gt;USE_TZ&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;p&gt;Run the migrations command to propagate changes you made to your models (creating a class, adding a field, deleting a model, etc.) into your database schema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;makemigrations&lt;/span&gt; &lt;span class="n"&gt;customerapi&lt;/span&gt;

&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt; &lt;span class="n"&gt;customerapi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once migration is done successfully, you'll see that database objects are created in your database. You can connect to your database and verify. Quickstart available here: &lt;a href="https://docs.microsoft.com/en-us/sql/azure-data-studio/quickstart-sql-database?view=sql-server-ver15"&gt;Quickstart: Use Azure Data Studio to connect and query Azure SQL database&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Run sample locally
&lt;/h2&gt;

&lt;p&gt;Execute the below command, to start the development web server on the local machine. By default, the server runs on port 8000 on the IP address 127.0.0.1. You can pass in an IP address and port number explicitly.&lt;/p&gt;

&lt;p&gt;Initialize Django - this is needed only the first time&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;

&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;createsuperuser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then run the server&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;runserver&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the Django application is running, you'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;...
System check identified no issues &lt;span class="o"&gt;(&lt;/span&gt;0 silenced&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
February 04, 2022 - 14:32:15
Django version 4.0.2, using settings &lt;span class="s1"&gt;'django-sql-project.settings'&lt;/span&gt;
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using a REST Client (like &lt;a href="https://insomnia.rest/"&gt;Insomnia&lt;/a&gt;, &lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt;, or curl), you can now call your API, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET http://127.0.0.1:8000/customerapi/customer/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you’ll get a response something like (based on available data in tables):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"CustomerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CustomerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Keith"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"CustomerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CustomerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Janet"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"CustomerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CustomerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cortana"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"CustomerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CustomerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Michael"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"CustomerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CustomerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"David"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"CustomerId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"CustomerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mike"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out the &lt;a href="https://github.com/azure-samples/azure-sql-db-django"&gt;sample&lt;/a&gt; to test all the CRUD operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy your application code to Azure App Service
&lt;/h2&gt;

&lt;p&gt;Azure App service supports multiple methods to deploy your application code to Azure including support for GitHub Actions and all major CI/CD tools. This article focuses on how to deploy your code from your local workstation to Azure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;If you don't have an Azure subscription, create a &lt;a href="https://azure.microsoft.com/en-us/free/"&gt;free&lt;/a&gt; account before you begin.&lt;/p&gt;

&lt;p&gt;This article requires that you're running the Azure CLI version 2.0 or later locally. To see the version installed, run the &lt;code&gt;az --version&lt;/code&gt; command. If you need to install or upgrade, see &lt;a href="https://docs.microsoft.com/en-us/cli/azure/install-azure-cli"&gt;Install Azure CLI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You'll need to login to your account using the &lt;a href="https://docs.microsoft.com/en-us/cli/azure/authenticate-azure-cli"&gt;az login&lt;/a&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have multiple subscriptions, choose the appropriate subscription in which the resource should be created. Select the specific subscription ID under your account using &lt;a href="https://docs.microsoft.com/en-us/cli/azure/account?view=azure-cli-latest"&gt;az account set&lt;/a&gt; command. Substitute the subscription ID property from the az login output for your subscription into the subscription ID placeholder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;az account set --subscription &amp;lt;subscription id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Refer &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/configure-language-python"&gt;this article&lt;/a&gt;, to know more about configuring a Linux Python app for Azure app Service.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Configure static files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;In your settings file, define &lt;code&gt;STATIC_URL&lt;/code&gt; and &lt;code&gt;STATIC_ROOT&lt;/code&gt;, for example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0/howto/static-files/
&lt;/span&gt;
&lt;span class="n"&gt;STATIC_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'/static/'&lt;/span&gt;
&lt;span class="n"&gt;STATIC_ROOT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'static'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run the &lt;code&gt;python manage.py collectstatic&lt;/code&gt; to gather static files into a directory at &lt;code&gt;STATIC_ROOT&lt;/code&gt; path for the admin site:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;collectstatic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create the App Service webapp and deploy code from a local workspace
&lt;/h3&gt;

&lt;p&gt;In the terminal, make sure you're in the repository root (&lt;code&gt;&amp;lt;working_folder&amp;gt;\azure-sql-db-django&lt;/code&gt;) that contains the app code.&lt;/p&gt;

&lt;p&gt;Run the below &lt;a href="https://docs.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest"&gt;az webapp&lt;/a&gt; commands:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/cli/azure/webapp?view=azure-cli-latest#az-webapp-up"&gt;az webapp up&lt;/a&gt; create a webapp and deploy code from a local workspace to the app. Python apps are created as Linux apps by default.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create a web app and deploy the code
az webapp up -g &amp;lt;MyResourceGroup&amp;gt; -l &amp;lt;location&amp;gt; -p &amp;lt;azure-sql-db-django-plan&amp;gt; --sku B1 -n &amp;lt;azure-sql-db-django-api&amp;gt; -r 'PYTHON:3.9'

# Configure database information as environment variables
az webapp config appsettings set --settings DB_SERVER="&amp;lt;azure-sql-server-name&amp;gt;.database.windows.net" DB_NAME="&amp;lt;db-name&amp;gt;" DB_USER="&amp;lt;db-user-id&amp;gt;" DB_PASSWORD="&amp;lt;db-password&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;For the &lt;code&gt;--resource-group -g&lt;/code&gt;, you can use the same resource group you created for the Database in the previous section.&lt;/li&gt;
&lt;li&gt;For the &lt;code&gt;--location -l&lt;/code&gt; argument, use the same location as you did for the database in the previous section.&lt;/li&gt;
&lt;li&gt;Create the &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/overview-hosting-plans"&gt;App Service plan&lt;/a&gt; &lt;em&gt;azure-sql-db-django-plan&lt;/em&gt; in the Basic pricing tier (B1), if it doesn't exist. --plan and --sku are optional.&lt;/li&gt;
&lt;li&gt;For the &lt;code&gt;--runtime -r&lt;/code&gt;, canonicalize runtime in the format of Framework|Version, e.g. "PYTHON|3.9". Allowed delimiters: "|" or ":". Use &lt;code&gt;az webapp list-runtimes --linux --output table&lt;/code&gt; for available list.&lt;/li&gt;
&lt;li&gt;The app code expects to find database information in a number of environment variables. To set environment variables in App Service, you create "app settings" with the &lt;a href="https://docs.microsoft.com/en-us/cli/azure/webapp/config/appsettings?view=azure-cli-latest#az_webapp_config_appsettings_set"&gt;az webapp config appsettings set&lt;/a&gt; command.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;App Service detects a Django project by looking for a wsgi.py file in each subfolder, which &lt;code&gt;manage.py startproject&lt;/code&gt; creates by default. When App Service finds that file, it loads the Django web app. For more information, see &lt;a href="https://docs.microsoft.com/en-us/azure/app-service/configure-language-python"&gt;Configure built-in Python image&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Browse to the app running on Azure App Service
&lt;/h2&gt;

&lt;p&gt;The Python Django sample code is running a Linux container in App Service using a built-in image.&lt;/p&gt;

&lt;p&gt;Browse to the deployed application in your web browser at the URL &lt;code&gt;https://&amp;lt;app-name&amp;gt;.azurewebsites.net/admin&lt;/code&gt; or make a call to the API &lt;code&gt;https://&amp;lt;app-name&amp;gt;.azurewebsites.net/customerapi/customer/&lt;/code&gt; using any other REST clients (like &lt;a href="https://insomnia.rest/"&gt;Insomnia&lt;/a&gt;, &lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt;, or curl).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt; You're running a Python Django app in Azure App Service for Linux, with Azure SQL database.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can use &lt;a href="https://github.com/microsoft/mssql-django"&gt;mssql-django&lt;/a&gt; as a backend for your existing Django 4.0 project with no major change if that's already configured for MS SQL Server.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you encounter any issues or have any feedback about &lt;a href="https://github.com/microsoft/mssql-django"&gt;mssql-django&lt;/a&gt;, head over to our mssql-django project repository and submit an issue.&lt;/p&gt;

</description>
      <category>python</category>
      <category>django</category>
      <category>azuresql</category>
      <category>database</category>
    </item>
    <item>
      <title>Saving Bot Activities in Azure SQL Database</title>
      <dc:creator>Abhiman Tiwari</dc:creator>
      <pubDate>Thu, 10 Feb 2022 10:23:06 +0000</pubDate>
      <link>https://dev.to/azure/saving-bot-activities-in-azure-sql-database-2444</link>
      <guid>https://dev.to/azure/saving-bot-activities-in-azure-sql-database-2444</guid>
      <description>&lt;p&gt;In this blog post, we’ll walkthrough of how to integrate Bot Framework v4 SDK with &lt;a href="https://azure.microsoft.com/en-us/products/azure-sql/database/#overview" rel="noopener noreferrer"&gt;Azure SQL Database&lt;/a&gt; and save Bot activities/ conversations into the database.&lt;/p&gt;

&lt;p&gt;We’ll leverage &lt;a href="https://www.nuget.org/packages/Bot.Builder.Community.Storage.EntityFramework/" rel="noopener noreferrer"&gt;&lt;code&gt;Bot.Builder.Community.Storage.EntityFramework&lt;/code&gt;&lt;/a&gt; package to save conversations using EntityFrameworkTranscriptStore with TranscriptLoggerMiddleware into Azure SQL Database.&lt;/p&gt;




&lt;h2&gt;
  
  
  Let’s start –
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Create Azure Sql Database:
&lt;/h2&gt;

&lt;p&gt;If you are new to Azure SQL and looking to understand more about different offerings of Azure SQL, you can start with &lt;a href="https://docs.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview" rel="noopener noreferrer"&gt;this article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have decided the type of Azure SQL Database that suits your requirement, you can navigate to the &lt;a href="https://ms.portal.azure.com/#create/Microsoft.AzureSQL" rel="noopener noreferrer"&gt;Select SQL Deployment options&lt;/a&gt; page and create your Database.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For this demo, I have created a single database in the &lt;a href="https://docs.microsoft.com/en-us/azure/azure-sql/database/serverless-tier-overview" rel="noopener noreferrer"&gt;serverless compute tier&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can follow &lt;a href="https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-portal" rel="noopener noreferrer"&gt;this article&lt;/a&gt; which explains the steps of creating an Azure SQL Database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect to the database:
&lt;/h2&gt;

&lt;p&gt;Once your Azure sql database is created, you can use the &lt;a href="https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?tabs=azure-portal#query-the-database" rel="noopener noreferrer"&gt;Query editor (preview)&lt;/a&gt; in the Azure portal to connect to the database and execute queries. Alternatively, you can also connect your database using &lt;a href="https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15" rel="noopener noreferrer"&gt;SSMS&lt;/a&gt; and &lt;a href="https://docs.microsoft.com/en-us/sql/azure-data-studio/download-azure-data-studio?view=sql-server-ver15" rel="noopener noreferrer"&gt;Azure Data Studio&lt;/a&gt;, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure portal, search for and select SQL databases, and then select your database from the list.&lt;/li&gt;
&lt;li&gt;On the page for your database, select Query editor (preview) in the left menu.&lt;/li&gt;
&lt;li&gt;Enter your server admin login information and select OK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fue7zj05u9ul86j78dgqr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fue7zj05u9ul86j78dgqr.png" alt="Query editor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Click on the &lt;code&gt;Connection strings&lt;/code&gt; link in the above blade and copy the connection string somewhere which we’ll use later in this demo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Create tables in your Azure SQL database:
&lt;/h2&gt;

&lt;p&gt;Now, you need to create tables in your Azure SQL database to store the Bot Activities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Execute the &lt;a href="https://github.com/abhimantiwari/botbuilder-community-dotnet/blob/develop/samples/EntityFramework%20Storage%20Sample/CreateTableScript.sql" rel="noopener noreferrer"&gt;CreateTableScript.sql&lt;/a&gt; script in your Azure SQL Database.&lt;/li&gt;
&lt;li&gt;Once you execute the &lt;code&gt;CreateTableScript.sql&lt;/code&gt; script in your Azure SQL Database, you should be able to see these two tables (
&lt;code&gt;BotDataEntity&lt;/code&gt; &amp;amp; &lt;code&gt;TranscriptEntity&lt;/code&gt;) created.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;We have just created the table, it doesn’t contain any data yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Getting Bot project ready:
&lt;/h2&gt;

&lt;p&gt;For this Demo, we will be using &lt;a href="https://dev.botframework.com/" rel="noopener noreferrer"&gt;Bot Framework&lt;/a&gt; v4 Echo bot sample which accepts input from the user and echoes it back.&lt;/p&gt;

&lt;p&gt;You may download the working code sample from &lt;a href="https://github.com/abhimantiwari/botbuilder-community-dotnet/tree/develop/samples/EntityFramework%20Storage%20Sample" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; or make the following changes to your existing Bot project.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import these packages into your Bot project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47q7zf82k2pgbhuwc2pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47q7zf82k2pgbhuwc2pr.png" alt="Packages"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add the following code to your bot project’s &lt;code&gt;Startup.cs&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var loggerConnectionString = Configuration["StoreConnectionString"];
var logger = new EntityFrameworkTranscriptStore(loggerConnectionString);
     services.AddSingleton&amp;lt;ITranscriptStore&amp;gt;(logger);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8hdzfxm71afenndfrlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh8hdzfxm71afenndfrlc.png" alt="Startup.cs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;ITranscriptStore&lt;/code&gt; as one of the parameters to &lt;code&gt;AdapterWithErrorHandler&lt;/code&gt; class, and Use &lt;code&gt;TranscriptLoggerMiddleware&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public AdapterWithErrorHandler(ITranscriptStore transcriptLogger, IConfiguration configuration, ILogger&amp;lt;BotFrameworkHttpAdapter&amp;gt; logger, ConversationState conversationState = null)
              : base(configuration, logger)
          {
              Use(new TranscriptLoggerMiddleware(transcriptLogger));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg63q9ovhjncjr4ujj3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpg63q9ovhjncjr4ujj3q.png" alt="AdapterWithErrorHandler"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ConnectionString you have copied from Azure sql database, put that into your Bot project against &lt;code&gt;StoreConnectionString&lt;/code&gt; key in appsettings.json file, something like shown below –
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      {
        "MicrosoftAppId": "",
        "MicrosoftAppPassword": "",
        "StoreConnectionString": "Server=tcp:YourSQLServerName.database.windows.net,1433;Initial Catalog=YourDatabaseName;Persist Security Info=False;User ID=YourSqlUserId;Password=YourSqlPassword;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
      }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;br&gt;
I have left &lt;code&gt;MicrosoftAppId&lt;/code&gt; and &lt;code&gt;MicrosoftAppPassword&lt;/code&gt; blank as I’ll be running my Bot locally in Emulator but if your Bot is deployed on some remote server e.g., Azure app service or Bot needs to communicate to other external services e.g., Cognitive services, then you will need to put MicrosoftAppId and MicrosoftAppPassword as well to authenticate your Bot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are almost done. Now you should be able to run your Bot project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s see it in Action:
&lt;/h2&gt;

&lt;p&gt;Run your bot code/ project (in case you have already hosted it to some web server e.g., Azure app service, you may skip this part) –&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you are running from the terminal, navigate to your Bot project folder and run dotnet run command.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    #run the bot
    dotnet run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If you are running from Visual Studio&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;- Launch Visual Studio&lt;/li&gt;
&lt;li&gt;- File -&amp;gt; Open -&amp;gt; Project/Solution&lt;/li&gt;
&lt;li&gt;- Navigate to your Bot project folder e.g., EntityFrameworkTranscriptStoreExample&lt;/li&gt;
&lt;li&gt;- Select your Bot project file e.g., EntityFrameworkTranscriptStoreExample.csproj file&lt;/li&gt;
&lt;li&gt;- Press F5 to run the project&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; As a prerequisite to run this project, make sure you have &lt;a href="https://dotnet.microsoft.com/en-us/download" rel="noopener noreferrer"&gt;.NET Core&lt;/a&gt; (&amp;gt;=3.1) version installed on your machine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Test the Bot using Bot Framework Emulator:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/microsoft/botframework-emulator" rel="noopener noreferrer"&gt;Bot Framework Emulator&lt;/a&gt; is a desktop application that allows Bot developers to Test and debug their bots on localhost or run remotely through a tunnel. You may install the Bot Framework Emulator from &lt;a href="https://github.com/Microsoft/BotFramework-Emulator/releases" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect to the bot using Bot Framework Emulator:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Launch Bot Framework Emulator&lt;/li&gt;
&lt;li&gt;File -&amp;gt; Open Bot&lt;/li&gt;
&lt;li&gt;Enter a Bot URL e.g., &lt;code&gt;http://localhost:3978/api/messages&lt;/code&gt;. You may also enter the URL of the remote web server hosting the Bot code but, in that case, you will also need to provide &lt;code&gt;MicrosoftAppId&lt;/code&gt; and &lt;code&gt;MicrosoftAppPassword&lt;/code&gt; for Bot to successfully authenticate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Once connected, send some messages to your Bot, and it should echo them back.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8u61jgwvao4ljy5lqln.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8u61jgwvao4ljy5lqln.png" alt="Emulator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Logs:
&lt;/h2&gt;

&lt;p&gt;Let’s &lt;strong&gt;Connect the database&lt;/strong&gt; to see if Bot Activities are being recorded. You should see the messages saved into the Azure SQL tables we have created.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;BotDataEntity&lt;/code&gt; should store one entry for each unique connection.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TranscriptEntity&lt;/code&gt; should contain all the conversations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fim34mxwl36v3qjtv252j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fim34mxwl36v3qjtv252j.png" alt="SQLDBData"&gt;&lt;/a&gt;&lt;br&gt;
If you query the tables, you should be able to fetch all the messages exchanged between the user and Bot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9npyw4fy1j0pxhprxitw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9npyw4fy1j0pxhprxitw.png" alt="SavedBotActivities"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt;&lt;br&gt;
Please note that depending on your Bot, you may need to specify in your Bot’s terms of use directly to notify your users whenever storing user data is involved.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>azure</category>
      <category>azurebotservice</category>
      <category>database</category>
      <category>azuresql</category>
    </item>
  </channel>
</rss>
