데이터 지속성-ZODB

ZODB (Zope object Database)는 Python 객체를 저장하기위한 데이터베이스입니다. ACID 호환-NOSQL 데이터베이스에는없는 기능입니다. ZODB는 또한 많은 NoSQL 데이터베이스처럼 수평 확장 가능하고 스키마가없는 오픈 소스입니다. 그러나 배포되지 않으며 쉽게 복제 할 수 없습니다. Python 객체에 대한 지속성 메커니즘을 제공합니다. Zope Application 서버의 일부이지만 독립적으로 사용할 수도 있습니다.

ZODB는 Zope Corporation의 Jim Fulton이 만들었습니다. 단순한 Persistent Object System으로 시작되었습니다. 현재 버전은 5.5.0이며 완전히 Python으로 작성되었습니다. 확장 된 버전의 Python 내장 객체 지속성 (pickle)을 사용합니다.

ZODB의 주요 기능 중 일부는-

  • transactions
  • history/undo
  • 투명한 플러그 형 스토리지
  • 내장 캐싱
  • MVCC (Multiversion Concurrency Control)
  • 네트워크를 통한 확장 성

ZODB는 hierarchical데이터 베이스. 데이터베이스가 생성 될 때 초기화되는 루트 개체가 있습니다. 루트 객체는 Python 사전처럼 사용되며 다른 객체 (사전과 유사 할 수 있음)를 포함 할 수 있습니다. 데이터베이스에 개체를 저장하려면 컨테이너 내부의 새 키에 할당하는 것으로 충분합니다.

ZODB는 데이터가 계층적이고 쓰기보다 읽기가 더 많은 애플리케이션에 유용합니다. ZODB는 pickle 객체의 확장입니다. 그렇기 때문에 Python 스크립트를 통해서만 처리 할 수 ​​있습니다.

최신 버전의 ZODB를 설치하려면 pip 유틸리티를 사용하십시오-

pip install zodb

다음 종속성도 설치됩니다-

  • BTrees==4.6.1
  • cffi==1.13.2
  • persistent==4.5.1
  • pycparser==2.19
  • six==1.13.0
  • transaction==2.4.0

ZODB는 다음과 같은 저장 옵션을 제공합니다.

FileStorage

이것이 기본값입니다. 본질적으로 트랜잭션 로그인 하나의 big Data.fs 파일에 저장된 모든 것.

DirectoryStorage

이것은 객체 개 정당 하나의 파일을 저장합니다. 이 경우 불완전한 종료시 Data.fs.index를 다시 빌드 할 필요가 없습니다.

RelStorage

이것은 관계형 데이터베이스에 피클을 저장합니다. PostgreSQL, MySQL 및 Oracle이 지원됩니다.

ZODB 데이터베이스를 생성하려면 스토리지, 데이터베이스, 마지막으로 연결이 필요합니다.

첫 번째 단계는 저장 개체를 갖는 것입니다.

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')

DB 클래스는이 저장소 개체를 사용하여 데이터베이스 개체를 가져옵니다.

db = ZODB.DB(storage)

DB 생성자에 None을 전달하여 메모리 내 데이터베이스를 만듭니다.

Db=ZODB.DB(None)

마지막으로 데이터베이스와의 연결을 설정합니다.

conn=db.open()

그런 다음 연결 개체는 'root ()'메서드를 사용하여 데이터베이스의 '루트'에 대한 액세스를 제공합니다. '루트'개체는 모든 영구 개체를 보유하는 사전입니다.

root = conn.root()

예를 들어, 다음과 같이 루트 객체에 학생 목록을 추가합니다.

root['students'] = ['Mary', 'Maya', 'Meet']

이 변경 사항은 트랜잭션을 커밋 할 때까지 데이터베이스에 영구적으로 저장되지 않습니다.

import transaction
transaction.commit()

사용자 정의 클래스의 객체를 저장하려면 해당 클래스가 persist.Persistent 상위 클래스에서 상속되어야합니다.

서브 클래 싱의 장점

Persistent 클래스를 서브 클래 싱하면 다음과 같은 장점이 있습니다.

  • 데이터베이스는 속성을 설정하여 변경된 개체를 자동으로 추적합니다.

  • 데이터는 자체 데이터베이스 레코드에 저장됩니다.

  • Persistent 하위 클래스가 아닌 데이터를 저장할 수 있지만 영구 개체가 참조하는 모든 데이터베이스 레코드에 저장됩니다. 비 영구 객체는 포함 된 영구 객체가 소유하며 여러 영구 객체가 동일한 비 영구 하위 객체를 참조하는 경우 자체 복사본을 얻습니다.

아래 에서처럼 영구 클래스를 하위 클래스로 정의하는 학생 클래스를 사용하자-

import persistent
   class student(persistent.Persistent):
   def __init__(self, name):
      self.name = name
   def __repr__(self):
      return str(self.name)

이 클래스의 객체를 추가하려면 먼저 위에서 설명한대로 연결을 설정합니다.

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()

객체를 루트에 추가하도록 선언 한 다음 트랜잭션을 커밋합니다.

s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()

root 객체는 내장 된 사전과 유사하므로, root에 추가 된 모든 객체의 목록은 items () 메서드를 사용하여 뷰 객체로 검색 할 수 있습니다.

print (root.items())
ItemsView({'s1': Akash})

루트에서 특정 개체의 속성을 가져 오려면

print (root['s1'].name)
Akash

개체를 쉽게 업데이트 할 수 있습니다. ZODB API는 순수한 Python 패키지이므로 외부 SQL 유형 언어를 사용할 필요가 없습니다.

root['s1'].name='Abhishek'
import transaction
transaction.commit()

데이터베이스는 즉시 업데이트됩니다. 트랜잭션 클래스는 SQL의 rollback () 트랜잭션 제어와 유사한 abort () 함수도 정의합니다.