associação pythonbrasil[11] django zope/plone planet Início Logado como (Entrar)

Diferenças para "DicasSqlalchemy"

Diferenças entre as versões de 1 e 8 (7 versões de distância)
Revisão 1e 2009-12-17 13:07:24
Tamanho: 1593
Editor: big_rid
Comentário:
Revisão 8e 2009-12-17 19:51:41
Tamanho: 1840
Comentário:
Deleções são marcadas assim. Adições são marcadas assim.
Linha 3: Linha 3:
=== Como criar um pool de conexões no sqlalchemy ? === = Usando sqlalchemy =
== Usando somente a query expression language ==
Linha 5: Linha 6:
from sqlalchemy import create_engine,Table,Column,Integer,String,MetaData,PrimaryKeyConstraint,Sequence,Boolean db.py
{{{#!python
from sqlalchemy import create_engine, Table, Column, MetaData
from sqlalchemy import Boolean,
Integer, Unicode, String
Linha 7: Linha 11:
from sqlalchemy.orm import sessionmaker
Linha 9: Linha 12:
#bdband -> alias criado no arquivo firebird.conf ( Firebird 2.1 ) ### para conexao no sqlite:
_url = 'sqlite://'
### para conexao no firebird
# _url = URL('firebird', 'SYSDBA', 'masterkey', '192.168.1.11', '3052', 'bdband')
### para conexao no mysql
# _url = 'mysql://usuario:senha@servidor/banco'
Linha 11: Linha 19:
_url = URL('firebird','SYSDBA','masterkey','192.168.1.11','3052','bdband')
engine = create_engine(_url)
# cria o engine e metadata
engine = create_engine(_url)
Linha 15: Linha 23:
#cria a tabela
cli_usu = Table('cli_usu',
                   metadata,
                   Column('cli_usu_id',Integer,Sequence('gn_cli_usu_id')),#criar um campo cli_usu_id, do tipo inteiro, utilizando sequence do banco
                   Column('nome',String(20),nullable=False),#criar um campo nome, do tipo String com tamanho 20, não aceitando null
                   Column('senha',String(10),nullable=False),#criar um campo senha, do tipo String com tamanho 10, não aceitando null
                   Column('ativo',Boolean,nullable=False)#criar um campo ativo, do tipo Boolean (no caso do firebird o sqlalchemy irá criar o campo ativo do tipo smallint (0-false,1-true ), não aceitando null
                   )
cli_usu_pk = PrimaryKeyConstraint('cli_usu_id',name='CLI_USU_PK') #criar a pk da tabela cli_usu, atribuindo um nome a constraint
cli_usu.append_constraint(cli_usu_pk) #incluindo a pk à tabela cli_usu
#cria as tabelas
tb_usuarios = Table('usuarios', metadata,
                 Column('id', Integer, primary_key=True),
                 Column('nome', Unicode(20), nullable=False),
                 Column('senha', String(10), nullable=False),
                 Column('ativo', Boolean, nullable=False)
        )
Linha 28: Linha 33:
}}}
Linha 29: Linha 35:
#cria o sessionmaker
Session = sessionmaker(bind=engine,autoflush=True,transactional=True)
Exemplo de uso do arquivo acima

{{{#!python
import db

# na hora de usar pega uma conexao
con = db.engine.connect()
ins = db.tb_usuarios.insert()
con.execute(ins, [
                dict(nome=u'jack', senha='senha', ativo=True),
                dict(nome=u'jonh', senha='ahnes', ativo=False),
            ])
con.close()
}}}


Um outro exemplo de uso, desta vez para consulta, e usando o contextlib.closing para fechar a conexão:

{{{#!python
import db
from contextlib import closing

with closing(db.engine.connect()) as con:
    sel_usuarios = db.tb_usuarios.select(db.tb_usuarios.c.ativo)
    resultado = con.execute(sel_usuarios)
    for registro in resultado:
        print registro.nome, registro.id, registro.senha, registro.ativo
# conexao fechada automaticamente, mesmo se der algum erro
}}}

Usando sqlalchemy

Usando somente a query expression language

db.py

   1 from sqlalchemy import create_engine, Table, Column, MetaData
   2 from sqlalchemy import Boolean, Integer, Unicode, String
   3 from sqlalchemy.engine.url import URL
   4 
   5 ### para conexao no sqlite:
   6 _url = 'sqlite://'
   7 ### para conexao no firebird
   8 # _url = URL('firebird', 'SYSDBA', 'masterkey', '192.168.1.11', '3052', 'bdband')
   9 ### para conexao no mysql
  10 # _url = 'mysql://usuario:senha@servidor/banco'
  11 
  12 # cria o engine e metadata
  13 engine = create_engine(_url)
  14 metadata = MetaData(bind=engine)
  15 
  16 #cria as tabelas
  17 tb_usuarios = Table('usuarios', metadata,
  18                  Column('id', Integer, primary_key=True),
  19                  Column('nome', Unicode(20), nullable=False),
  20                  Column('senha', String(10), nullable=False),
  21                  Column('ativo', Boolean, nullable=False)
  22         )
  23 
  24 #cria as tabelas no banco (caso nao existam)
  25 metadata.create_all()

Exemplo de uso do arquivo acima

   1 import db
   2 
   3 # na hora de usar pega uma conexao
   4 con = db.engine.connect()
   5 ins = db.tb_usuarios.insert()
   6 con.execute(ins, [
   7                 dict(nome=u'jack', senha='senha', ativo=True),
   8                 dict(nome=u'jonh', senha='ahnes', ativo=False), 
   9             ])
  10 con.close()

Um outro exemplo de uso, desta vez para consulta, e usando o contextlib.closing para fechar a conexão:

   1 import db
   2 from contextlib import closing
   3 
   4 with closing(db.engine.connect()) as con:
   5     sel_usuarios = db.tb_usuarios.select(db.tb_usuarios.c.ativo) 
   6     resultado = con.execute(sel_usuarios)
   7     for registro in resultado:
   8         print registro.nome, registro.id, registro.senha, registro.ativo
   9 # conexao fechada automaticamente, mesmo se der algum erro