{"id":6307,"date":"2024-05-03T11:00:45","date_gmt":"2024-05-03T02:00:45","guid":{"rendered":"https:\/\/engineer-chanpu.blog\/?p=6307"},"modified":"2024-05-05T09:58:00","modified_gmt":"2024-05-05T00:58:00","slug":"sql-server-app-service-pyodbc-connection-%ec%97%b0%ea%b2%b0-%ec%95%8c%ec%95%84-%eb%b3%b4%ea%b8%b0-1","status":"publish","type":"post","link":"https:\/\/engineer-chanpu.blog\/?p=6307","title":{"rendered":"SQL Server: App Service PYODBC Connection \uc5f0\uacb0 \uc54c\uc544 \ubcf4\uae30 #1"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Agenda<\/h1>\n\n\n\n<p>SQL IAM (Identity and Access Management) \uc124\uc815\uc5d0 App Service\uc758 \uc2dc\uc2a4\ud15c \ud560\ub2f9 \uad00\ub9ac ID\ub85c \uc720\uc800\ub97c \uc0dd\uc131\ud558\uace0, \uc5ed\ud560\uc744 \ud560\ub2f9\ud558\ub294 \uac83\ub9cc\uc73c\ub85c\ub294 \uc571\uc774 SQL Database \uc640 \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4. \ucee4\ub125\uc158 \uc124\uc815\uc744 \ucd94\uac00\ud568\uc73c\ub85c \uc5f0\uacb0 \ubc0f \ucffc\ub9ac\ub97c \uc2e4\ud589\ud560 \uc218 \uc788\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p>Microsoft Learn \uc758 \ubb38\uc11c\ub97c \ucc38\uace0\ud558\uc5ec \ud14c\uc2a4\ud2b8\ub97c \uc9c4\ud589\ud588\uace0, \uba87 \uac00\uc9c0\uc2dc\ud589\ucc29\uc624\uc5d0 \ub300\ud574\uc11c \uc815\ub9ac\ud558\ub824\uace0 \ud55c\ub2e4.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-sql\/database\/azure-sql-python-quickstart?view=azuresql&amp;tabs=windows%2Csql-inter\">Microsoft Learn<\/a> \uc744 \ucc38\uace0\ub85c PyODBC \ucee4\ub125\ud2b8 \uc124\uc815\uc5d0 \ub300\ud574\uc11c \uc54c\uc544 \ubcf8\ub2e4.\n<ul class=\"wp-block-list\">\n<li>Prerequisites<\/li>\n\n\n\n<li>An&nbsp;<a href=\"https:\/\/azure.microsoft.com\/free\/python\/\">Azure subscription<\/a>.<\/li>\n\n\n\n<li>An Azure SQL database configured with Microsoft Entra authentication. You can create one using the&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/azure-sql\/database\/single-database-create-quickstart?view=azuresql\">Create database quickstart<\/a>.<\/li>\n\n\n\n<li>The latest version of the&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/cli\/azure\/get-started-with-azure-cli\">Azure CLI<\/a>.<\/li>\n\n\n\n<li>Visual Studio Code with the&nbsp;<a href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ms-python.python\">Python extension<\/a>.<\/li>\n\n\n\n<li>Python 3.8 or later. If you&#8217;re using a Linux client machine, see&nbsp;<a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/connect\/python\/pyodbc\/step-1-configure-development-environment-for-pyodbc-python-development?tabs=linux#install-the-odbc-driver\">Install the ODBC driver<\/a>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\ub85c\uceec \ud658\uacbd\uacfc Azure \ud658\uacbd\uc5d0\uc11c Python \ucee4\ub125\uc158 \ub3d9\uc791\uc5d0 \ub300\ud574\uc11c \uc54c\uc544 \ubcf8\ub2e4.<\/li>\n\n\n\n<li>SQL Server \ub124\ud2b8\uc6cc\ud06c \uc124\uc815\uc5d0 \ub300\ud574\uc11c \uc54c\uc544 \ubcf8\ub2e4.<\/li>\n<\/ol>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Commnads<\/h2>\n\n\n\n<p>\ub098\ub294 \ud14c\uc2a4\ud2b8\uc5d0 Powershell \uc744 \uc0ac\uc6a9\ud574\uc11c, Microsoft \ubb38\uc11c\uc758 \uba85\ub839\uc5b4\ub97c \ucc38\uace0\ud558\uc5ec \uc218\uc815\ud558\uc600\ub2e4. <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><code>$app_name<\/code> : App Service \ub9ac\uc18c\uc2a4 \uc774\ub984\uc774 \uc911\ubcf5\ub418\uba74 App Service \ubc30\ud3ec\uc5d0 \ubb38\uc81c\uac00 \ub418\ubbc0\ub85c, \uc911\ubcf5\ub418\uc9c0 \uc54a\ub294 \uac12\uc73c\ub85c \uc218\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li><code>$connectino_string<\/code> : \uc544\ub798\uc758 \uac12\uc744 \uc790\uc2e0\uc758 \ud658\uacbd\uc5d0 \ub9de\ucdb0 \uc218\uc815\ud55c\ub2e4.\n<ul class=\"wp-block-list\">\n<li>Server=tcp:&lt;SQL_SERVER_NAME&gt;.database.windows.net<\/li>\n\n\n\n<li>Database=&lt;SQL_DATABASE_NAME&gt;<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Variable for Local Test\n$env:AZURE_SQL_CONNECTIONSTRING = &quot;Driver={ODBC Driver 18 for SQL Server};Server=tcp:demo-kgineer-sql.database.windows.net,1433;Database=demo-kgineer-sqldb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;&quot;\n\n# Run the app.py file \nuvicorn app:app --reload\n\n# Variables\n$rg_name = &quot;azure-learn-rg&quot;\n$app_name = &quot;azure-learn-demo-app&quot;\n$connection_string = &quot;Driver={ODBC Driver 18 for SQL Server};Server=tcp:demo-kgineer-sql.database.windows.net,1433;Database=demo-kgineer-sqldb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;&quot;\n\n# Azure CLI Commands\naz webapp up `\n  --resource-group $rg_name `\n  --name $app_name\n\naz webapp config set `\n  --resource-group $rg_name `\n  --name $app_name `\n  --startup-file start.sh\n\naz webapp identity assign `\n  --resource-group $rg_name `\n  --name $app_name\n\n# SQL Query\nCREATE USER [azure-learn-demo-app] FROM EXTERNAL PROVIDER\nALTER ROLE db_datareader ADD MEMBER [azure-learn-demo-app]\nALTER ROLE db_datawriter ADD MEMBER [azure-learn-demo-app]\n\n# Azure Commands\naz webapp config appsettings set `\n  --resource-group $rg_name `\n  --name $app_name `\n  --settings AZURE_SQL_CONNECTIONSTRING=$connection_string\n\n# App Service API URL\nhttps:\/\/azure-learn-demo-app.azurewebsites.net\/docs\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\"># Variable for Local Test<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">$env:AZURE_SQL_CONNECTIONSTRING<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Driver={ODBC Driver 18 for SQL Server};Server=tcp:demo-kgineer-sql.database.windows.net,1433;Database=demo-kgineer-sqldb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Run the app.py file <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">uvicorn app:app --reload<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Variables<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">$rg_name<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;azure-learn-rg&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">$app_name<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;azure-learn-demo-app&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">$connection_string<\/span><span style=\"color: #D4D4D4\"> = <\/span><span style=\"color: #CE9178\">&quot;Driver={ODBC Driver 18 for SQL Server};Server=tcp:demo-kgineer-sql.database.windows.net,1433;Database=demo-kgineer-sqldb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Azure CLI Commands<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">az webapp up `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --resource-group <\/span><span style=\"color: #9CDCFE\">$rg_name<\/span><span style=\"color: #D4D4D4\"> `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --name <\/span><span style=\"color: #9CDCFE\">$app_name<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">az webapp config set `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --resource-group <\/span><span style=\"color: #9CDCFE\">$rg_name<\/span><span style=\"color: #D4D4D4\"> `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --name <\/span><span style=\"color: #9CDCFE\">$app_name<\/span><span style=\"color: #D4D4D4\"> `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --startup-file start.sh<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">az webapp identity assign `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --resource-group <\/span><span style=\"color: #9CDCFE\">$rg_name<\/span><span style=\"color: #D4D4D4\"> `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --name <\/span><span style=\"color: #9CDCFE\">$app_name<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># SQL Query<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">CREATE USER [<\/span><span style=\"color: #569CD6\">azure<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">learn<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">demo<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">app<\/span><span style=\"color: #D4D4D4\">] <\/span><span style=\"color: #C586C0\">FROM<\/span><span style=\"color: #D4D4D4\"> EXTERNAL PROVIDER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ALTER ROLE db_datareader ADD MEMBER [<\/span><span style=\"color: #569CD6\">azure<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">learn<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">demo<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">app<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">ALTER ROLE db_datawriter ADD MEMBER [<\/span><span style=\"color: #569CD6\">azure<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">learn<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">demo<\/span><span style=\"color: #D4D4D4\">-<\/span><span style=\"color: #569CD6\">app<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Azure Commands<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">az webapp config appsettings set `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --resource-group <\/span><span style=\"color: #9CDCFE\">$rg_name<\/span><span style=\"color: #D4D4D4\"> `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --name <\/span><span style=\"color: #9CDCFE\">$app_name<\/span><span style=\"color: #D4D4D4\"> `<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">  --settings AZURE_SQL_CONNECTIONSTRING=<\/span><span style=\"color: #9CDCFE\">$connection_string<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># App Service API URL<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">https:\/\/azure-learn-demo-app.azurewebsites.net\/docs<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Create the project<\/h3>\n\n\n\n<p>Python \ud504\ub85c\uc81d\ud2b8\ub97c \uc704\ud55c \ub514\ub809\ud1a0\ub9ac\ub97c \uc0dd\uc131\ud55c\ub2e4. <\/p>\n\n\n\n<p>\ub514\ub809\ud1a0\ub9ac \uc0dd\uc131 \uc704\uce58\ub294 \uc911\uc694\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c, \ub300\ucda9 \uc544\ubb34\uacf3\uc774\ub098 \uc9c0\uc815\ud558\uba74 \ub41c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Open Visual Studio Code and create a new folder for your project and change directory into it.\nNew-Item -ItemType Directory -Name python-sql-azure\ncd python-sql-azure\n\n# Create a virtual environment for the app.\npy -m venv .venv\n.venv\\scripts\\activate\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\"># Open Visual Studio Code and create a new folder for your project and change directory into it.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">New-Item<\/span><span style=\"color: #D4D4D4\"> -ItemType Directory -Name python-sql-azure<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">cd python-sql-azure<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Create a virtual environment for the app.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">py -m venv .venv<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">.venv\\scripts\\activate<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"930\" height=\"171\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-18.png\" alt=\"\" class=\"wp-image-6308\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-18.png 930w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-18-300x55.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-18-768x141.png 768w\" sizes=\"auto, (max-width: 930px) 100vw, 930px\" \/><figcaption class=\"wp-element-caption\">.venv \uac00\uc0c1 \ud658\uacbd\uc5d0 \uc9c4\uc785<\/figcaption><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">Note.<\/h4>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background is-style-wide\"\/>\n\n\n\n<p><code>(.venv)<\/code>\ub294 PowerShell \uba85\ub839\uc904 \ud504\ub86c\ud504\ud2b8\uc5d0\uc11c \ud604\uc7ac \ud65c\uc131\ud654\ub41c Python \uac00\uc0c1 \ud658\uacbd\uc744 \ub098\ud0c0\ub0b4\ub294 \uac83\uc774\ub2e4. \uc5ec\uae30\uc11c <code>.venv<\/code>\ub294 \uac00\uc0c1 \ud658\uacbd\uc758 \uc774\ub984\uc774\uba70, \uc774 \ud658\uacbd\uc740 Python \ud328\ud0a4\uc9c0\uc640 \uc758\uc874\uc131\uc744 \ud504\ub85c\uc81d\ud2b8\ubcc4\ub85c \uaca9\ub9ac\ud558\uc5ec \uad00\ub9ac\ud558\ub3c4\ub85d \ud574\uc900\ub2e4. \uac00\uc0c1 \ud658\uacbd\uc744 \uc0ac\uc6a9\ud558\uba74 \uc2dc\uc2a4\ud504\uc758 \ub2e4\ub978 Python \ud504\ub85c\uc81d\ud2b8\uc640 \ub3c5\ub9bd\uc801\uc73c\ub85c \uc791\uc5c5\ud560 \uc218 \uc788\uc5b4, \uc758\uc874\uc131 \ucda9\ub3cc\uc744 \ubc29\uc9c0\ud558\uace0 \ud504\ub85c\uc81d\ud2b8\uc758 \uc694\uad6c \uc0ac\ud56d\uc744 \ub354 \uc27d\uac8c \uad00\ub9ac\ud560 \uc218 \uc788\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background is-style-wide\"\/>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Install the pyodbc driver<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Create a requirements.txt file with the following lines\npyodbc\nfastapi\nuvicorn[standard]\npydantic\nazure-identity\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\"># Create a requirements.txt file with the following lines<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">pyodbc<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">fastapi<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">uvicorn[<\/span><span style=\"color: #569CD6\">standard<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">pydantic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">azure-identity<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>.vnev \ub514\ub809\ud1a0\ub9ac \ud558\uc704\uc5d0 requirements.txt \ub97c \ub9cc\ub4e4\uace0, \uac12\uc744 \ubd99\uc5ec \ub123\ub294\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"611\" height=\"344\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-19.png\" alt=\"\" class=\"wp-image-6312\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-19.png 611w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-19-300x169.png 300w\" sizes=\"auto, (max-width: 611px) 100vw, 611px\" \/><\/figure>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>requirements.txt \ub97c \uc9c0\uc815\ud558\uc5ec pip install \uba85\ub839\uc5b4\ub97c \uc2e4\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Install the requirements.\npip install -r requirements.txt\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\"># Install the requirements.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">pip install -r requirements.txt<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Configure the local connection string<\/h3>\n\n\n\n<p>\uc900\ube44\ud55c  Connection string \uc744 \ub85c\uceec \ud658\uacbd \ubcc0\uc218\ub85c \uc9c0\uc815\ud55c\ub2e4. <\/p>\n\n\n\n<p>Powershell \uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc73c\ubbc0\ub85c, export \uba85\ub839\uc5b4\ub294 \uc2e4\ud589\ub418\uc9c0 \uc54a\ub294\ub2e4. \ub300\uc2e0\uc5d0 $env:&lt;variable_name&gt; \uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"$env:AZURE_SQL_CONNECTIONSTRING=&quot;Driver={ODBC Driver 18 for SQL Server};Server=tcp:demo-kgineer-sql.database.windows.net,1433;Database=demo-kgineer-sqldb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;&quot;\n\necho $env:AZURE_SQL_CONNECTIONSTRING\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">$env:AZURE_SQL_CONNECTIONSTRING=<\/span><span style=\"color: #CE9178\">&quot;Driver={ODBC Driver 18 for SQL Server};Server=tcp:demo-kgineer-sql.database.windows.net,1433;Database=demo-kgineer-sqldb;Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">echo $env:AZURE_SQL_CONNECTIONSTRING<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Microsoft \ubb38\uc11c\uc5d0 \uc788\ub294 \uc608\uc81c \ucf54\ub4dc\ub97c \ubcf5\uc0ac\ud558\uc5ec  app.py \ud30c\uc77c\uc744 \uc791\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"import os\nimport pyodbc, struct\nfrom azure import identity\n\nfrom typing import Union\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\n\nclass Person(BaseModel):\n    first_name: str\n    last_name: Union[str, None] = None\n    \nconnection_string = os.environ[&quot;AZURE_SQL_CONNECTIONSTRING&quot;]\n\napp = FastAPI()\n\n@app.get(&quot;\/&quot;)\ndef root():\n    print(&quot;Root of Person API&quot;)\n    try:\n        conn = get_conn()\n        cursor = conn.cursor()\n\n        # Table should be created ahead of time in production app.\n        cursor.execute(&quot;&quot;&quot;\n            CREATE TABLE Persons (\n                ID int NOT NULL PRIMARY KEY IDENTITY,\n                FirstName varchar(255),\n                LastName varchar(255)\n            );\n        &quot;&quot;&quot;)\n\n        conn.commit()\n    except Exception as e:\n        # Table may already exist\n        print(e)\n    return &quot;Person API&quot;\n\n@app.get(&quot;\/all&quot;)\ndef get_persons():\n    rows = []\n    with get_conn() as conn:\n        cursor = conn.cursor()\n        cursor.execute(&quot;SELECT * FROM Persons&quot;)\n\n        for row in cursor.fetchall():\n            print(row.FirstName, row.LastName)\n            rows.append(f&quot;{row.ID}, {row.FirstName}, {row.LastName}&quot;)\n    return rows\n\n@app.get(&quot;\/person\/{person_id}&quot;)\ndef get_person(person_id: int):\n    with get_conn() as conn:\n        cursor = conn.cursor()\n        cursor.execute(&quot;SELECT * FROM Persons WHERE ID = ?&quot;, person_id)\n\n        row = cursor.fetchone()\n        return f&quot;{row.ID}, {row.FirstName}, {row.LastName}&quot;\n\n@app.post(&quot;\/person&quot;)\ndef create_person(item: Person):\n    with get_conn() as conn:\n        cursor = conn.cursor()\n        cursor.execute(f&quot;INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)&quot;, item.first_name, item.last_name)\n        conn.commit()\n\n    return item\n\ndef get_conn():\n    credential = identity.DefaultAzureCredential(exclude_interactive_browser_credential=False)\n    token_bytes = credential.get_token(&quot;https:\/\/database.windows.net\/.default&quot;).token.encode(&quot;UTF-16-LE&quot;)\n    token_struct = struct.pack(f'&lt;I{len(token_bytes)}s', len(token_bytes), token_bytes)\n    SQL_COPT_SS_ACCESS_TOKEN = 1256  # This connection option is defined by microsoft in msodbcsql.h\n    conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})\n    return conn\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> os<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> pyodbc, struct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> azure <\/span><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> identity<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> typing <\/span><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> Union<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> fastapi <\/span><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> FastAPI<\/span><\/span>\n<span class=\"line\"><span style=\"color: #C586C0\">from<\/span><span style=\"color: #D4D4D4\"> pydantic <\/span><span style=\"color: #C586C0\">import<\/span><span style=\"color: #D4D4D4\"> BaseModel<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">class<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Person<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #4EC9B0\">BaseModel<\/span><span style=\"color: #D4D4D4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    first_name: <\/span><span style=\"color: #4EC9B0\">str<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    last_name: Union[<\/span><span style=\"color: #4EC9B0\">str<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #569CD6\">None<\/span><span style=\"color: #D4D4D4\">] = <\/span><span style=\"color: #569CD6\">None<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">connection_string = os.environ[<\/span><span style=\"color: #CE9178\">&quot;AZURE_SQL_CONNECTIONSTRING&quot;<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">app = FastAPI()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">@app.get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\/&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">def<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">root<\/span><span style=\"color: #D4D4D4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;Root of Person API&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        conn = get_conn()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor = conn.cursor()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\"># Table should be created ahead of time in production app.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor.execute(<\/span><span style=\"color: #CE9178\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            CREATE TABLE Persons (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                ID int NOT NULL PRIMARY KEY IDENTITY,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                FirstName varchar(255),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                LastName varchar(255)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">        &quot;&quot;&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        conn.commit()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">except<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #4EC9B0\">Exception<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #C586C0\">as<\/span><span style=\"color: #D4D4D4\"> e:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\"># Table may already exist<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(e)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Person API&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">@app.get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\/all&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">def<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_persons<\/span><span style=\"color: #D4D4D4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    rows = []<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">with<\/span><span style=\"color: #D4D4D4\"> get_conn() <\/span><span style=\"color: #C586C0\">as<\/span><span style=\"color: #D4D4D4\"> conn:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor = conn.cursor()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor.execute(<\/span><span style=\"color: #CE9178\">&quot;SELECT * FROM Persons&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> row <\/span><span style=\"color: #C586C0\">in<\/span><span style=\"color: #D4D4D4\"> cursor.fetchall():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #DCDCAA\">print<\/span><span style=\"color: #D4D4D4\">(row.FirstName, row.LastName)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">            rows.append(<\/span><span style=\"color: #569CD6\">f<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #D4D4D4\">row.ID<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">, <\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #D4D4D4\">row.FirstName<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">, <\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #D4D4D4\">row.LastName<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> rows<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">@app.get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\/person\/<\/span><span style=\"color: #569CD6\">{person_id}<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">def<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_person<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">person_id<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #4EC9B0\">int<\/span><span style=\"color: #D4D4D4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">with<\/span><span style=\"color: #D4D4D4\"> get_conn() <\/span><span style=\"color: #C586C0\">as<\/span><span style=\"color: #D4D4D4\"> conn:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor = conn.cursor()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor.execute(<\/span><span style=\"color: #CE9178\">&quot;SELECT * FROM Persons WHERE ID = ?&quot;<\/span><span style=\"color: #D4D4D4\">, person_id)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        row = cursor.fetchone()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">f<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #D4D4D4\">row.ID<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">, <\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #D4D4D4\">row.FirstName<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">, <\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #D4D4D4\">row.LastName<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #DCDCAA\">@app.post<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\/person&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">def<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">create_person<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #9CDCFE\">item<\/span><span style=\"color: #D4D4D4\">: Person):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">with<\/span><span style=\"color: #D4D4D4\"> get_conn() <\/span><span style=\"color: #C586C0\">as<\/span><span style=\"color: #D4D4D4\"> conn:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor = conn.cursor()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor.execute(<\/span><span style=\"color: #569CD6\">f<\/span><span style=\"color: #CE9178\">&quot;INSERT INTO Persons (FirstName, LastName) VALUES (?, ?)&quot;<\/span><span style=\"color: #D4D4D4\">, item.first_name, item.last_name)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        conn.commit()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> item<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">def<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">get_conn<\/span><span style=\"color: #D4D4D4\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    credential = identity.DefaultAzureCredential(<\/span><span style=\"color: #9CDCFE\">exclude_interactive_browser_credential<\/span><span style=\"color: #D4D4D4\">=<\/span><span style=\"color: #569CD6\">False<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    token_bytes = credential.get_token(<\/span><span style=\"color: #CE9178\">&quot;https:\/\/database.windows.net\/.default&quot;<\/span><span style=\"color: #D4D4D4\">).token.encode(<\/span><span style=\"color: #CE9178\">&quot;UTF-16-LE&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    token_struct = struct.pack(<\/span><span style=\"color: #569CD6\">f<\/span><span style=\"color: #CE9178\">&#39;&lt;I<\/span><span style=\"color: #569CD6\">{<\/span><span style=\"color: #DCDCAA\">len<\/span><span style=\"color: #D4D4D4\">(token_bytes)<\/span><span style=\"color: #569CD6\">}<\/span><span style=\"color: #CE9178\">s&#39;<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #DCDCAA\">len<\/span><span style=\"color: #D4D4D4\">(token_bytes), token_bytes)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    SQL_COPT_SS_ACCESS_TOKEN = <\/span><span style=\"color: #B5CEA8\">1256<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #6A9955\"># This connection option is defined by microsoft in msodbcsql.h<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    conn = pyodbc.connect(connection_string, <\/span><span style=\"color: #9CDCFE\">attrs_before<\/span><span style=\"color: #D4D4D4\">={SQL_COPT_SS_ACCESS_TOKEN: token_struct})<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> conn<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"972\" height=\"431\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-20.png\" alt=\"\" class=\"wp-image-6313\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-20.png 972w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-20-300x133.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-20-768x341.png 768w\" sizes=\"auto, (max-width: 972px) 100vw, 972px\" \/><figcaption class=\"wp-element-caption\">app.py<\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Run and test the app locally<\/h3>\n\n\n\n<p>\uc544\ub798\uc758 \uba85\ub839\uc5b4\ub294 <code>app.py<\/code> \ud30c\uc77c \ub0b4\uc5d0 \uc815\uc758\ub41c <code>app<\/code> \uac1d\uccb4\ub97c \uc0ac\uc6a9\ud558\uc5ec \uac1c\ubc1c \uc11c\ubc84\ub97c \uc2dc\uc791\ud558\uace0, \uc18c\uc2a4 \ucf54\ub4dc\uac00 \ubcc0\uacbd\ub420 \ub54c\ub9c8\ub2e4 \uc11c\ubc84\ub97c \uc790\ub3d9\uc73c\ub85c \ub2e4\uc2dc \uc2dc\uc791\ud558\ub3c4\ub85d \uc124\uc815\ud55c\ub2e4. \uc11c\ubc84\ub97c \uc2dc\uc791 \ud55c \ud6c4 <a href=\"http:\/\/127.0.0.1:8000\/docs\">http:\/\/127.0.0.1:8000\/docs<\/a> \ub85c \uc811\uc18d\ud558\uc5ec \ub85c\uceec \ud658\uacbd\uc5d0\uc11c \ud14c\uc2a4\ud2b8\uac00 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"# Run the app.py file in Visual Studio Code.\nuvicorn app:app --reload\n\n# Running logs\nINFO:     Will watch for changes in these directories: ['C:\\\\Users\\\\cchi9\\\\OneDrive\\\\github_repo\\\\azure-python\\\\python-sql-azure\\\\.venv']\nINFO:     Uvicorn running on http:\/\/127.0.0.1:8000 (Press CTRL+C to quit)\nINFO:     Started reloader process [17276] using WatchFiles\nINFO:     Started server process [27096]\nINFO:     Waiting for application startup.\nINFO:     Application startup complete.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6A9955\"># Run the app.py file in Visual Studio Code.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">uvicorn app:app --reload<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\"># Running logs<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">INFO:     Will watch <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> changes <\/span><span style=\"color: #C586C0\">in<\/span><span style=\"color: #D4D4D4\"> these directories: [<\/span><span style=\"color: #CE9178\">&#39;C:\\\\Users\\\\cchi9\\\\OneDrive\\\\github_repo\\\\azure-python\\\\python-sql-azure\\\\.venv&#39;<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">INFO:     Uvicorn running on http:\/\/<\/span><span style=\"color: #B5CEA8\">127.0<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">0.1<\/span><span style=\"color: #D4D4D4\">:<\/span><span style=\"color: #B5CEA8\">8000<\/span><span style=\"color: #D4D4D4\"> (Press CTRL+C to quit)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">INFO:     Started reloader <\/span><span style=\"color: #C586C0\">process<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #B5CEA8\">17276<\/span><span style=\"color: #D4D4D4\">] using WatchFiles<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">INFO:     Started server <\/span><span style=\"color: #C586C0\">process<\/span><span style=\"color: #D4D4D4\"> [<\/span><span style=\"color: #B5CEA8\">27096<\/span><span style=\"color: #D4D4D4\">]<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">INFO:     Waiting <\/span><span style=\"color: #C586C0\">for<\/span><span style=\"color: #D4D4D4\"> application startup.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">INFO:     Application startup complete.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"290\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-21-1024x290.png\" alt=\"\" class=\"wp-image-6314\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-21-1024x290.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-21-300x85.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-21-768x217.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-21-1536x435.png 1536w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-21.png 1576w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><a href=\"http:\/\/127.0.0.1:8000\/docs\">http:\/\/127.0.0.1:8000\/docs<\/a><\/figcaption><\/figure>\n\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>\ub85c\uceec \uc11c\ubc84\uc5d0\uc11c API \ub97c \uc774\uc6a9\ud558\uc5ec SQL DB \uc640 \uc815\uc0c1\uc801\uc73c\ub85c \uc5f0\ub3d9\ub418\uace0 \uc788\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. <\/p>\n\n\n\n<p><code>root<\/code> API \ub97c \uc2e4\ud589\ud558\uc5ec, SQL DB\uc5d0 Persons \ud14c\uc774\ube14\uc774 \uc0dd\uc131\ub418\ub294 \uac83\uc744 \ud14c\uc2a4\ud2b8\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"app = FastAPI()\n\n@app.get(&quot;\/&quot;)\ndef root():\n    print(&quot;Root of Person API&quot;)\n    try:\n        conn = get_conn()\n        cursor = conn.cursor()\n\n        # Table should be created ahead of time in production app.\n        cursor.execute(&quot;&quot;&quot;\n            CREATE TABLE Persons (\n                ID int NOT NULL PRIMARY KEY IDENTITY,\n                FirstName varchar(255),\n                LastName varchar(255)\n            );\n        &quot;&quot;&quot;)\n\n        conn.commit()\n    except Exception as e:\n        # Table may already exist\n        print(e)\n    return &quot;Person API&quot;\n\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\">app = FastAPI()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #9CDCFE\">@app<\/span><span style=\"color: #DCDCAA\">.get<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #CE9178\">&quot;\/&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">def root():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    print(<\/span><span style=\"color: #CE9178\">&quot;Root of Person API&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">try<\/span><span style=\"color: #D4D4D4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        conn = get_conn()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor = conn.cursor()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\"># Table should be created ahead of time in production app.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        cursor.execute(<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D7BA7D\">&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            CREATE TABLE Persons (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                ID int NOT NULL PRIMARY KEY IDENTITY,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                FirstName varchar(255),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">                LastName varchar(255)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">            );<\/span><\/span>\n<span class=\"line\"><span style=\"color: #CE9178\">        <\/span><span style=\"color: #D7BA7D\">&quot;&quot;<\/span><span style=\"color: #CE9178\">&quot;<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        conn.commit()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    except Exception as e:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        <\/span><span style=\"color: #6A9955\"># Table may already exist<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">        print(e)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #C586C0\">return<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #CE9178\">&quot;Person API&quot;<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"584\" src=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-22-1024x584.png\" alt=\"\" class=\"wp-image-6315\" srcset=\"https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-22-1024x584.png 1024w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-22-300x171.png 300w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-22-768x438.png 768w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-22-1536x876.png 1536w, https:\/\/engineer-chanpu.blog\/wp-content\/uploads\/2024\/05\/image-22.png 1741w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">http:\/\/127.0.0.1:8000\/docs#\/default\/root__get API\ub97c \uc2e4\ud589 \ud6c4 Persons \ud14c\uc774\ube14\uc774 \uc0dd\uc131\ub41c \ud654\uba74<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Agenda SQL IAM (Identity and Access Management) \uc124\uc815\uc5d0 App Service\uc758 \uc2dc\uc2a4\ud15c \ud560\ub2f9 \uad00\ub9ac ID\ub85c \uc720\uc800\ub97c \uc0dd\uc131\ud558\uace0, \uc5ed\ud560\uc744 \ud560\ub2f9\ud558\ub294 \uac83\ub9cc\uc73c\ub85c\ub294 \uc571\uc774 SQL Database \uc640 \uc5f0\uacb0\ub418\uc9c0 \uc54a\uc558\ub2e4. \ucee4\ub125\uc158 \uc124\uc815\uc744 \ucd94\uac00\ud568\uc73c\ub85c \uc5f0\uacb0 \ubc0f &#8230;<\/p>\n","protected":false},"author":1,"featured_media":6350,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[205,107,200,33],"tags":[172,123,179],"class_list":["post-6307","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-access-security","category-azure","category-data-storage-solutions","category-tech-notes","tag-app-service","tag-azure","tag-sql-database"],"_links":{"self":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts\/6307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6307"}],"version-history":[{"count":9,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts\/6307\/revisions"}],"predecessor-version":[{"id":6349,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/posts\/6307\/revisions\/6349"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=\/wp\/v2\/media\/6350"}],"wp:attachment":[{"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/engineer-chanpu.blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}