3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AzureのTable ストレージを使ったDjango(PTVS)アプリの作成とデプロイ

Last updated at Posted at 2016-10-25

#TableストレージのNoSQLデータストアとは
NoSQL(一般に "Not only SQL" と解釈される)とは、関係データベース管理システム (RDBMS) 以外のデータベース管理システムを指すおおまかな分類語
NoSQL系データベース管理システムには、データの格納および取得が高度に最適化されているものが多い。その最適化のために機能性を最小限にしているものもある。「値」およびそれを取得するための「キー」だけを格納できるKey-Value型データベースは、その最たる例である。wikiより
NoSQLデータベース環境とは、簡単に言えば、幅広い種類の膨大な量のデータを高速かつ動的に整理し分析することを可能にする、非リレーショナルな広域分散データベースシステムです。引用
このNoSQLを使ったストレージサービスをNoSQLデータストアといいAzure上で提供されている。

#Djangoのアプリケーション作成
前回の続きになります。
NoSQLを使うためのPythonのパッケージの解説をしてきます。
一部解説しますが、詳しくはこちら

##Python Azure Storage パッケージ
テーブル作成
TableService:Azure上のNoSQLデータストアにアクセス
create_table:テーブルを作成

account_name = 'ストレージのアカウント名'
account_key = 'key(複数あるkeyのどれかで良い)'
table_service = TableService(account_name=account_name, account_key=account_key)
table_service.create_table('mytasks')

抽出
table_service.query_entities('テーブル名','','レコード指定')
SQLに直すと:Select name,category From mytasks;

tasks = table_service.query_entities('mytasks', '', 'name,category')
for task in tasks:
    print(task.name)
    print(task.category)

挿入
※PartitionKeyとRowKeyを指定する必要があることに注意してください
PartitionKeyが同じエンティティは同じノードに格納されます。RowKeyは、エンティティが属するパーティション内のエンティティの一意のID

table_service.insert_entity('mytasks', {'PartitionKey':name+category, 'RowKey':name, 'name':name, 'category':category})     

置き換える
エンティティ内に存在していれば置き換え、なければ挿入
第二引数、第三引数は同様にPartitionKeyRowKeyを指定

task = {'name':YUKI, 'category':Friends}
table_service.insert_or_replace_entity('mytasks', name+category, name, task)

更新
PartitionKeyRowKeyを指定して、レコードを更新できる

table_service.update_entity('mytasks', partition_key, row_key, {'name': name, 'category':category})

エンティティの削除
エンティティを削除する場合はPartitionKeyRowKeyを指定することで削除できる

table_service.delete_entity('mytasks',name+category,name)

テーブル削除

table_service.delete_table('tasktable')

##Djangoアプリケーション作成
前回のを少し改造して、削除機能を追加した。

views.py
from django.shortcuts import render
from django.http import HttpRequest
from django.template import RequestContext
from datetime import datetime

from django.http import HttpResponse
from django.template.loader import render_to_string
from azure.storage.table import TableService, Entity

account_name = 'ストレージ名'
account_key = 'ストレージのkey'
table_service = TableService(account_name=account_name, account_key=account_key)
table_service.create_table('mytasks')

def list_tasks(request):      
    entities = table_service.query_entities('mytasks', '', 'name,category')
    html = render_to_string('app/test.html', {'entities':entities})     
    return HttpResponse(html)
 
 
def add_task(request):     
    name = request.GET['name']     
    category = request.GET['category']        
    table_service.insert_entity('mytasks', {'PartitionKey':name+category, 'RowKey':name, 'name':name, 'category':category})     
    entities = table_service.query_entities('mytasks', '', 'name,category')     
    html = render_to_string('app/test.html', {'entities':entities})     
    return HttpResponse(html)
 

def update_task(request):     
    name = request.GET['name']     
    category = request.GET['category']
    table_service.delete_entity('mytasks',name+category,name)
    entities = table_service.query_entities('mytasks', '', 'name,category')         
    html = render_to_string('app/test.html', {'entities':entities})     
    return HttpResponse(html)
test.html
<!DOCTYPE html>
<html>
    <head>
        <title></title>
    </head>     
    <body>
        <h2>My Tasks</h2> <br>     
        <table border="1">
            <tr>
                <td>Name</td>
                <td>Category</td>
                <td>Check</td>
            </tr>     
            {% for entity in entities %}     
                <form action="update_task" method="GET">
                    <tr>
                        <td>{{entity.name}} <input type="hidden" name='name' value="{{entity.name}}"></td>     
                        <td>{{entity.category}} <input type="hidden" name='category' value="{{entity.category}}"></td>   
                        <td><input type="submit" value="削除"></td> 
                    </tr>     
                </form>     
            {% endfor %}     
        </table>     
        <br>     
        <hr>    
        <table border="1">
            <form action="add_task" method="GET">
                <tr>
                    <td>Name:</td
                    ><td><input type="text" name="name"></input></td>
                </tr>     
                <tr>
                    <td>Category:</td>
                    <td><input type="text" name="category"></input></td>
                </tr>     
                <tr>
                    <td><input type="submit" value="add task"></input></td>
                </tr>     
            </form>     
        </table>     
    </body>     
</html>
urls.py
urlpatterns = [
    url(r'^$', 'app.views.list_tasks'),
    url(r'^list_tasks$', 'app.views.list_tasks'),
    url(r'^add_task$', 'app.views.add_task'),
    url(r'^update_task$', 'app.views.update_task'),
]

##実行
新しく実装した削除機能のみを試す
削除ボタンを押すとレコードが削除される

※実際に調べた限り、Azure上のストレージでテーブルやレコードの削除をすることができません。テーブル削除をAzure上で行いたいのであれば、ストレージを作り直すという手もあります。ただ、めんどくさいし、大変なので、プログラム上で(パッケージを使って)削除することをお勧めします。

1.png 2.png

#Tableストレージを使ったDjangoアプリをAzure上にデプロイ
プロジェクトを右クリックし、**【公開】**を選択
1.png

Microsoft Azure Web Appsを選択し**【発行】**
2.png

【New】で新しいアプリを作成します!
3.png

Web App nameApp service planに任意の名前をつける
Resource groupはなければ作成してください
4.png

基本的に確認のみで、細かい設定をしたい方は**【次へ】を選択
問題ないのでそのまま
【発行】**
すると、Azure上にUPされる
5.png

最後にAzureのポータル管理画面から
【App Service】➡︎【作成したAPP名】➡︎【概要】➡︎【URL】
を選択すると先ほど作成したDjangoアプリケーションが動く!!
6.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?