집 >
백엔드 개발 >
파이썬 튜토리얼 >
Python을 사용하여 NoSQL 데이터베이스 샘플 코드 공유를 완료하는 방법
Python을 사용하여 NoSQL 데이터베이스 샘플 코드 공유를 완료하는 방법
黄舟
풀어 주다: 2017-07-18 11:12:57
원래의
1902명이 탐색했습니다.
NoSQL은 최근 몇 년 동안 널리 사용되는 용어입니다. 그런데 "NoSQL"은 정확히 무엇을 의미합니까? 이 기사에서는 어떻게 그리고 왜 그렇게 유용한가요? 구조화된 의사 코드") NoSQL 데이터베이스를 작성하여 이러한 질문에 답하세요.
OldSQL
많은 경우 SQL은 "데이터베이스"의 동의어가 되었습니다. 실제로 SQL은 Strctured Query Language의 약어입니다. 데이터베이스 기술 자체를 말하는 것입니다. 오히려 RDBMS(Relational Database Management System)에서 데이터를 검색하는 언어를 말합니다. MySQL, MS SQL Server 및 Oracle은 모두 RDBMS의 R입니다. "관계형"(관계, 연관)이 가장 풍부한 부분입니다. 데이터는 테이블
을 통해 구성되며, 각 테이블은
유형으로 연결된 열으로 구성됩니다. 모든 테이블의 유형, 열 및 해당 클래스를 호출합니다. 데이터베이스의 schema(스키마 또는 스키마)이 전달됩니다. 각 테이블의 설명 정보는 데이터베이스의 구조를 완전히 설명합니다. 예를 들어 Car라는 테이블에는 다음 열이 있을 수 있습니다. :
가 열 중 하나입니다. 이는 각 행을 고유하게 식별할 수 있습니다. Car</ code> 테이블에서 VIN은 각 차량이 고유한 식별자를 갖도록 보장하므로 Make에서 동일한 값을 가질 수 있습니다. 모델, 연도 및 색상 열은 다르지만 자동차의 경우 VIN이 분명히 다를 것입니다. 반대로 두 행의 VIN이 동일한 경우 다른 열을 확인하지 않고도 두 행이 동일한 자동차를 참조한다고 생각할 수 있습니다. <td></td>Querying<td></td>SQL을 사용하면 데이터베이스에서 <td>query</td>를 수행하여 유용한 정보를 얻을 수 있습니다. <td>Query</td> 간단히 말해서 쿼리는 구조화된 언어를 사용하여 RDBMS에 질문하고 반환되는 행을 해석합니다. 질문에 대한 답은 데이터베이스가 미국에 등록된 모든 차량에 대해 </tr>모든</tbody> 기록을 얻기 위해 데이터베이스에서 다음 </table>SQL 쿼리🎜를 수행할 수 있다는 것을 가정합니다. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">SELECT Vehicle.Model, Vehicle.Year FROM Vehicle, ServiceHistory WHERE Vehicle.VIN = ServiceHistory.VIN AND ServiceHistory.Price > 75.00;</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜대략 SQL을 중국어로 번역합니다. :🎜<ul class="list-paddingleft-2" ><li>🎜"SELECT": "Show me"🎜</li><li>🎜"Make, Model": "Make and Model value"🎜</ li><li>🎜"FROM Car": "Car 테이블의 각 행에 대해" 🎜</li></ul>🎜 즉, "테이블의 각 행에 있는 제조사 및 모델의 값을 보여줍니다. Car". 쿼리를 실행하면 각각 제조사와 모델인 몇 가지 쿼리 결과를 얻게 됩니다. 1994년에 등록된 자동차의 색상에만 관심이 있다면 다음을 수행할 수 있습니다.🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:sql;toolbar:false;">COMMAND; [KEY]; [VALUE]; [VALUE TYPE]</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜이 시점에서 우리는 다음과 유사한 목록을 얻습니다.🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:python;toolbar:false;">"""NoSQL database written in Python"""
# Standard library imports
import socket
HOST = &#39;localhost&#39;
PORT = 50505
SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
STATS = {
&#39;PUT&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;GET&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;GETLIST&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;PUTLIST&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;INCREMENT&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;APPEND&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;DELETE&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
&#39;STATS&#39;: {&#39;success&#39;: 0, &#39;error&#39;: 0},
}</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜마지막으로 테이블의 🎜(기본 키) 기본 키🎜를 사용할 수 있습니다. 여기에 자동차에 대한 쿼리를 지정하는 VIN이 있습니다.🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:python;toolbar:false;">COMMAND_HANDERS = {
&#39;PUT&#39;: handle_put,
&#39;GET&#39;: handle_get,
&#39;GETLIST&#39;: handle_getlist,
&#39;PUTLIST&#39;: handle_putlist,
&#39;INCREMENT&#39;: handle_increment,
&#39;APPEND&#39;: handle_append,
&#39;DELETE&#39;: handle_delete,
&#39;STATS&#39;: handle_stats,
}
DATA = {}
def main():
"""Main entry point for script"""
SOCKET.bind(HOST, PORT)
SOCKET.listen(1)
while 1:
connection, address = SOCKET.accept()
print(&#39;New connection from [{}]&#39;.format(address))
data = connection.recv(4096).decode()
command, key, value = parse_message(data)
if command == &#39;STATS&#39;:
response = handle_stats()
elif command in (&#39;GET&#39;, &#39;GETLIST&#39;, &#39;INCREMENT&#39;, &#39;DELETE&#39;):
response = COMMAND_HANDERS[command](key)
elif command in (
&#39;PUT&#39;,
&#39;PUTLIST&#39;,
&#39;APPEND&#39;, ):
response = COMMAND_HANDERS[command](key, value)
else:
response = (False, &#39;Unknown command type {}&#39;.format(command))
update_stats(command, response[0])
connection.sandall(&#39;{};{}&#39;.format(response[0], response[1]))
connection.close()
if __name__ == &#39;__main__&#39;:
main()</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜위 쿼리 문은 다음을 반환합니다. 🎜🎜기본 키는 고유하고 반복 불가능한 것으로 정의됩니다. 즉, 특정 VIN을 가진 차량은 테이블에 최대 한 번만 나타날 수 있습니다. 이것이 왜 중요한가요? 예를 들어보세요: 🎜🎜Relations🎜🎜우리가 자동차 수리 사업을 운영하고 있다고 가정해 보세요. 또한 자동차의 서비스 기록, 즉 자동차의 모든 수리 기록을 추적해야 합니다. 다음 열이 포함된 code>ServiceHistory 테이블: 🎜🎜🎜🎜🎜 VIN🎜🎜Make🎜🎜Model🎜🎜Year🎜🎜Color🎜🎜Service Performed🎜🎜Mechanic🎜🎜Price🎜🎜Date🎜 🎜🎜🎜
이런 식으로 차량을 수리할 때마다 테이블에 새 행을 추가하고 서비스 중에 수행한 작업, 수리공이 누구인지, 비용은 얼마인지, 서비스 시간 등을 기록합니다.
그런데 잠깐만요. 한눈에 우리 모두는 동일한 차량에 대해 차량 자체 정보와 관련된 모든 열이 변경되지 않음을 알고 있습니다. 즉, 내 Black 2014 Lexus RX 350을 10번 개조하면 제조사, 모델, 연식, 색상 정보가 변경되지 않더라도 정보가 매번 반복적으로 기록됩니다. 합리적인 접근 방식은 이러한 정보를 한 번만 저장하고 필요할 때 쿼리하는 것입니다.
그럼 어떻게 해야 할까요? 다음 열이 있는 Vehicle이라는 두 번째 테이블을 만들 수 있습니다. ServiceHistory 테이블을 다음 열로 단순화할 수 있습니다. Vehicle , 它有如下一些列:
最后还须需要注意的一小点: DATA 字典, 因为这个点并不十分重要, 因而你很可能会遗漏它。 DATA 就是实际用来存储的 key-value pair, 正是它们实际构成了我们的数据库。
Command Parser
下面来看一些 命令解析器 (command parser) , 它负责解释接收到的消息:
def parse_message(data):
"""Return a tuple containing the command, the key, and (optionally) the
value cast to the appropriate type."""
command, key, value, value_type = data.strip().split(';')
if value_type:
if value_type == 'LIST':
value = value.split(',')
elif value_type == 'INT':
value = int(value)
else:
value = str(value)
else:
value = None
return command, key, value
def update_stats(command, success):
"""Update the STATS dict with info about if executing *command* was a
*success*"""
if success:
STATS[command]['success'] += 1
else:
STATS[command]['error'] += 1
def handle_put(key, value):
"""Return a tuple containing True and the message to send back to the
client."""
DATA[key] = value
return (True, 'key [{}] set to [{}]'.format(key, value))
def handle_get(key):
"""Return a tuple containing True if the key exists and the message to send
back to the client"""
if key not in DATA:
return (False, 'Error: Key [{}] not found'.format(key))
else:
return (True, DATA[key])
def handle_putlist(key, value):
"""Return a tuple containing True if the command succeeded and the message
to send back to the client."""
return handle_put(key, value)
def handle_putlist(key, value):
"""Return a tuple containing True if the command succeeded and the message
to send back to the client"""
return handle_put(key, value)
def handle_getlist(key):
"""Return a tuple containing True if the key contained a list and the
message to send back to the client."""
return_value = exists, value = handle_get(key)
if not exists:
return return_value
elif not isinstance(value, list):
return (False, 'ERROR: Key [{}] contains non-list value ([{}])'.format(
key, value))
else:
return return_value
def handle_increment(key):
"""Return a tuple containing True if the key's value could be incremented
and the message to send back to the client."""
return_value = exists, value = handle_get(key)
if not exists:
return return_value
elif not isinstance(list_value, list):
return (False, 'ERROR: Key [{}] contains non-list value ([{}])'.format(
key, value))
else:
DATA[key].append(value)
return (True, 'Key [{}] had value [{}] appended'.format(key, value))
def handle_delete(key):
"""Return a tuple containing True if the key could be deleted and the
message to send back to the client."""
if key not in DATA:
return (
False,
'ERROR: Key [{}] not found and could not be deleted.'.format(key))
else:
del DATA[key]
def handle_stats():
"""Return a tuple containing True and the contents of the STATS dict."""
return (True, str(STATS))
handle_append를 살펴보겠습니다. handle_get을 호출하려고 시도했지만 키가 존재하지 않으면 간단히 handle_get에서 반환된 콘텐츠를 반환합니다. >. 또한 handle_get이 반환한 튜플을 별도의 반환 값으로 참조할 수 있기를 원합니다. 그런 다음 키가 존재하지 않으면 간단히 return return_value를 사용할 수 있습니다.handle_append . 如果我们尝试调用 handle_get 但是 key 并不存在时, 那么我们简单地返回 handle_get 所返回的内容。 此外, 我们还希望能够将 handle_get 返回的 tuple 作为一个单独的返回值进行引用。 那么当 key 不存在的时候, 我们就可以简单地使用 return return_value .
, 반환 값을 확인해야 합니다. 또한 handle_get의 반환 값을 별도의 변수로 참조할 수 있기를 바랍니다. 위의 두 가지 상황을 처리하고 결과를 별도로 처리해야 하는 상황을 고려하기 위해 다중 할당을 사용합니다. 이렇게 하면 코드를 명확하게 유지하면서 여러 줄의 코드를 작성할 필요가 없습니다. return_value = 존재, list_value = handler_get(key)는 최소한 두 가지 다른 방법으로 handle_get의 반환 값을 참조할 것임을 명시적으로 나타낼 수 있습니다. 이것이 어떻게 데이터베이스인가요?위 프로그램은 분명히 RDBMS는 아니지만 확실히 NoSQL 데이터베이스라고 부를 수 있습니다. 만들기가 너무 쉬운 이유는
data
와 실제 상호 작용이 없기 때문입니다. 우리는 최소한의 유형 검사를 수행하고 사용자가 보내는 모든 것을 저장합니다. 더 많은 구조화된 데이터를 저장해야 하는 경우 데이터를 저장하고 검색하기 위해 데이터베이스에 대한 스키마를 생성해야 할 수도 있습니다.
NoSQL 데이터베이스는 작성하기 쉽고, 유지 관리하기 쉽고, 구현하기도 쉽기 때문에 그냥 mongoDB를 사용하는 것이 어떨까요? 물론 이유가 있습니다. NoSQL 데이터베이스가 제공하는 데이터 유연성을 기반으로 데이터베이스의 검색 가능성을 평가해야 합니다.
데이터 쿼리
가정해 보세요. 위의 NoSQL 데이터베이스를 사용하여 이전 자동차 데이터를 저장합니다. 그런 다음 VIN을 키로 사용하고 목록을 각 열의 값으로 사용할 수 있습니다. 즉, 2134AFGER245267 = ['Lexus', 'RX350', 2013, Black] 입니다. 목록에 있는 각 인덱스의
의미
가 손실되었습니다. 인덱스 1이 자동차 모델을 저장하고 인덱스 2가 연도를 저장한다는 것만 알면 됩니다.
실행하려고 할 때 나쁜 점은 발생합니다. 이전 쿼리 문이 사용됩니까? 모든 1994년 자동차의 색상을 찾는 것은 악몽이 될 것입니다. DATA의
각 값을 탐색하여 이 값이 자동차 데이터를 저장하는지 아니면 단순히 다른 관련 없는 데이터를 저장하는지 확인해야 합니다. 예를 들어, 인덱스 2의 값이 1994와 같은지 확인하고, 그런 다음 계속해서 인덱스 3의 값을 가져옵니다. 이는 모든 데이터 행을 스캔할 뿐만 아니라 쿼리에 응답하기 위해 몇 가지 복잡한 규칙을 적용해야 하기 때문에 테이블 스캔보다 더 나쁩니다. 🎜NoSQL 데이터베이스 작성자는 쿼리가 매우 유용한 기능이라는 점을 고려하여 이러한 문제를 확실히 인식하고 있으며 쿼리가 "접근할 수 없는" 문제를 덜 해결하는 몇 가지 방법도 알아냈습니다. 한 가지 접근 방식은 JSON과 같이 사용되는 데이터를 구조화하여 다른 행에 대한 참조가 관계를 나타낼 수 있도록 하는 것입니다. 동시에 대부분의 NoSQL 데이터베이스에는 네임스페이스라는 개념이 있습니다. 단일 유형의 데이터는 데이터베이스의 해당 유형에 고유한 "섹션"에 저장될 수 있으며, 이를 통해 쿼리 엔진은 데이터의 "모양"을 활용할 수 있습니다. 쿼리할 데이터 정보입니다. 🎜🎜물론, 쿼리 가능성을 높이기 위해 좀 더 정교한 방법이 존재하고 구현되었지만, 더 적은 양의 스키마를 저장하는 것과 쿼리 가능성을 향상시키는 것 사이의 절충은 항상 피할 수 없는 문제입니다. 이 예에서 데이터베이스는 키별 쿼리만 지원합니다. 더 풍부한 쿼리를 지원해야 한다면 상황은 훨씬 더 복잡해집니다. 🎜🎜요약🎜🎜이 시점에서 “NoSQL”의 개념이 아주 명확해졌으면 좋겠습니다. 우리는 SQL에 대해 조금 배웠고 RDBMS가 어떻게 작동하는지 보았습니다. 우리는 RDBMS에서 데이터를 검색하는 방법(SQL 🎜query🎜 사용)을 살펴보았습니다. 장난감 수준의 NoSQL 데이터베이스를 구축함으로써 쿼리 가능성과 단순성 사이에 직면한 몇 가지 문제에 대해 알아보고 일부 데이터베이스 작성자가 이를 처리하기 위해 사용하는 몇 가지 방법에 대해 논의했습니다. 이러한 문제로. 🎜🎜🎜🎜🎜🎜🎜🎜
위 내용은 Python을 사용하여 NoSQL 데이터베이스 샘플 코드 공유를 완료하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!