#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})
置き換える
エンティティ内に存在していれば置き換え、なければ挿入
第二引数、第三引数は同様にPartitionKeyとRowKeyを指定
task = {'name':YUKI, 'category':Friends}
table_service.insert_or_replace_entity('mytasks', name+category, name, task)
更新
PartitionKeyとRowKeyを指定して、レコードを更新できる
table_service.update_entity('mytasks', partition_key, row_key, {'name': name, 'category':category})
エンティティの削除
エンティティを削除する場合はPartitionKeyとRowKeyを指定することで削除できる
table_service.delete_entity('mytasks',name+category,name)
テーブル削除
table_service.delete_table('tasktable')
##Djangoアプリケーション作成
前回のを少し改造して、削除機能を追加した。
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)
<!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>
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上で行いたいのであれば、ストレージを作り直すという手もあります。ただ、めんどくさいし、大変なので、プログラム上で(パッケージを使って)削除することをお勧めします。
#Tableストレージを使ったDjangoアプリをAzure上にデプロイ
プロジェクトを右クリックし、**【公開】**を選択
Microsoft Azure Web Appsを選択し**【発行】**
Web App nameとApp service planに任意の名前をつける
Resource groupはなければ作成してください
基本的に確認のみで、細かい設定をしたい方は**【次へ】を選択
問題ないのでそのまま【発行】**
すると、Azure上にUPされる
最後にAzureのポータル管理画面から
【App Service】➡︎【作成したAPP名】➡︎【概要】➡︎【URL】
を選択すると先ほど作成したDjangoアプリケーションが動く!!