Python com CouchDB usando couchdbkit

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

[ Hits: 6.185 ]

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

Cadastro de pacientes - Py3k

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

Conexão python com Mysql

inserção

Dump MySQL com relatório de logs por e-mail


  

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