Python com CouchDB usando couchdbkit

Publicado por Francisco Souza (última atualização em 04/11/2009)

[ Hits: 6.161 ]

Homepage: http://www.franciscosouza.net

Download livraria_couch.py




Demonstração do Python acessando um banco de dados CouchDB, usando a biblioteca couchdbkit.

O exemplo é baseado em outro script que já enviei:

Serialização em Python usando picle ( http://www.vivaolinux.com.br/script/Serializacao-em-Python-usando-pickle )

  



Esconder código-fonte

#! /usr/bin/python
# coding: utf-8
'''Este módulo cria um pequeno sistema de cadastro de livros usando CouchDB para armazenamento.

Requisitos:
  * couchdbkit: http://couchdbkit.org/

:version: 0.1
:author: Francisco Antônio da Silva Souza
:see: http://www.franciscosouza.net/sobre/
'''
from couchdbkit.client import Server
from couchdbkit.schema.base import Document
from couchdbkit.schema.properties import StringProperty, IntegerProperty
import os
import sys

try:
    import psyco
    psyco.full()
except:
    pass

MY_DIR = os.path.dirname(os.path.abspath(__file__))

def force_decode(valor):
    '''Tenta trasnformar uma string em unicode, de forma forçada

    PARÂMETROS
        valor (obrigatório) : str
            Valor a ser transformado em unicode

    RETORNO
        Objeto unicode contendo a string transformada.
    '''
    try:
        resposta = valor.decode('utf-8')
    except:
        try:
            resposta = valor.decode('iso-8859-1')
        except:
            resposta = valor

    return resposta

class Autor(Document):
    nome = StringProperty()

class Livro(Document):
    titulo = StringProperty()
    edicao = IntegerProperty()

class CouchDBManager(object):
    '''Classe que faz o gerenciamento do banco de dados
    '''
    def __init__(self):
        self.autores = []
        self.livros = []
        self.conectar()
        self.recuperar()
        
    def conectar(self):
        '''Método que efetua conexão com o servidor de banco de dados.
        '''
        self.servidor = Server('http://localhost:5984')
        self.db = self.servidor.get_or_create_db('livros')
        Autor.set_db(self.db)
        Livro.set_db(self.db)

    def inserir_autor(self, nome):
        '''Faz a inserção do autor em um atributo (e não no banco).

        O atributo é uma lista, que é mantida toda em memória, apenas quando o método salvar é chamado que os dados são salvos no banco de dados.
        '''
        autor = Autor()
        autor.nome = nome
        self.autores.append(autor)

    def inserir_livro(self, titulo, edicao, autor):
        '''Faz a inserção do livro em um atributo (e não no banco).

        O atributo é uma lista, que é mantida toda em memória, apenas quando o método salvar é chamado que os dados são salvos no banco de dados.
        '''
        livro = Livro()
        livro.titulo = titulo
        livro.edicao = edicao
        livro.autor = autor
        self.livros.append(livro)

    def salvar(self):
        '''Salva os dados das listas de livros e autores no banco de dados.
        '''
        for autor in self.autores:
            autor.save()

        for livro in self.livros:
            livro.save()

    def recuperar(self):
        '''Carrega os dados do banco de dados nas listas de autores e livros.
        '''
        self.autores = Autor.view('autores/all').all()
        self.livros = Livro.view('livros/all', include_docs=True).all()

    def recriar(self):
        '''Apaga todos os dados (tanto do banco de dados quanto da memória) e recria as listas vazias.
        '''
        self.servidor.delete_db('livros')
        self.db = self.servidor.get_or_create_db('livros')
        self.autores = []
        self.livros = []

def inserir_autor(manager):
    '''Cadastra um novo autor
    '''
    nome = raw_input('Qual o nome do autor? ')
    nome = force_decode(nome)
    manager.inserir_autor(nome)
    print 'Autor %s cadastrado com sucesso!' % nome
    print

def visualizar_autores(manager):
    '''Visualiza os autores cadastrados
    '''
    print 'LISTA DE AUTORES'
    ct = 1
    for autor in manager.autores:
        print '[%d] %s' % (ct, autor.nome)
        ct += 1
    print

def inserir_livro(manager):
    titulo = raw_input('Qual o título do livro? ')
    titulo = force_decode(titulo)
    edicao = input('Qual a edição do livro? ')
    visualizar_autores(manager)
    cd_autor = input('Selecione o código do autor: ')
    autor = manager.autores[cd_autor - 1].to_json()
    manager.inserir_livro(titulo, edicao, autor)
    print 'Livro %s cadastrado com sucesso!' % titulo
    print

def visualizar_livros(manager):
    '''Visualiza os livros cadastrados
    '''
    print 'LISTA DE LIVROS'
    ct = 1
    for livro in manager.livros:
        print '[%d] %s (Autor: %s, Edicao: %d)' % (ct, livro.titulo, livro.autor['nome'], livro.edicao)
        ct += 1
    print

def salvar(manager):
    manager.salvar()
    print 'Dados salvos com sucesso no banco de dados!'
    print

def apagar_tudo(manager):
    manager.recriar()

funcoes = [
    inserir_autor, visualizar_autores, inserir_livro, visualizar_livros, salvar, apagar_tudo
]

def get_menu():
    '''Retorna o texto para o menu.

    RETORNO:
        Texto do menu.
    '''
    menu = '''Selecione sua opção:

    1 - Inserir um Autor
    2 - Visualizar Autores Cadastrados
    3 - Inserir um Livro
    4 - Visualizar Livros Cadastrados
    5 - Salvar os dados no banco
    6 - Apagar todos os dados do disco
    7 - Sair do sistema

Selecione sua opção: '''
    return menu

def main(args):
    manager = CouchDBManager()
    resposta = input(get_menu())
    while (resposta < 7):
        resposta -= 1
        funcoes[resposta](manager)
        resposta = input(get_menu())

    print 'Obrigado por usar o programa! :)'

if __name__ == '__main__':
    main(sys.argv)

Scripts recomendados

Banco de dados int Python

Acompanhar status de uma replicação MySQL

Dígito verificador, módulo 11 simples, para uso interno no "postgresql" como

Conexão python com Mysql

Cadastro de pacientes - Py3k


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts