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

Diferenças para "DicasSqlalchemy"

Diferenças entre as versões de 6 e 8 (2 versões de distância)
Revisão 6e 2009-12-17 16:13:15
Tamanho: 1724
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:
=== Criando tabela no sqlalchemy === = Usando sqlalchemy =
== Usando somente a query expression language ==
Linha 5: Linha 6:
db.py
Linha 6: Linha 8:

#este arquivo: db.py:

from sqlalchemy import create_engine,Table,Column,Integer,String,MetaData
from sqlalchemy import PrimaryKeyConstraint,Sequence,Boolean
from
sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, Table, Column, MetaData
from sqlalchemy import Boolean, Integer, Unicode, String
Linha 14: Linha 12:
#bdband -> alias criado no arquivo firebird.conf ( Firebird 2.1 )
#bdband pode ser substituido por 'c:/dados/banco.fdb'
### 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 17: 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 21: Linha 23:
#cria a tabela
cli_usu = Table('cli_usu',
                 metadata,
                 Column('cli_usu_id',Integer,Sequence('gn_cli_usu_id')),
                 Column('nome',String(20),nullable=False),
                 Column('senha',String(10),nullable=False),
                 Column('ativo',Boolean,nullable=False)
                 )
#cria a pk
cli_usu_pk = PrimaryKeyConstraint('cli_usu_id',name='CLI_USU_PK')

#adiciona a pk a tabela
cli_usu.append_constraint(cli_usu_pk)
#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 37: Linha 33:
}}}
Linha 38: Linha 35:
#cria o sessionmaker
Session = sessionmaker(bind=engine,autoflush=True)
Exemplo de uso do arquivo acima
Linha 41: Linha 37:
sessao = Session()
ins = cli_usu.insert().values(nome='jack',senha='senha',ativo='1')
sessao.execute(ins)
sessao.commit()
sessao.close()
{{{#!python
import db
Linha 47: Linha 40:
#Agora, a partir de qualquer lugar do seu projeto, voce pode instanciar uma sessao. # 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()
}}}
Linha 49: Linha 50:
#outro arquivo: login.py
Um outro exemplo de uso, desta vez para consulta, e usando o contextlib.closing para fechar a conexão:

{{{#!python
Linha 51: Linha 55:
sessao = db.Session()
sel_cli = db.cli_usu.select(db.cli_usu.c.ativo==1)
result = sessao.execute(sel_cli)
for row in result:
    print row.nome,row.cli_usu_id,row.senha,row.ativo
sessao.commit()
sessao.close()
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