Você está na página 1de 8

Conectividade do MySQL com Python

Tradutor: Douglas Soares de Andrade dsa em unilestemg ponto br


Site Original: http://www.devshed.com/c/a/Python/MySQ!"onnectivity!#ith!Python/
$ma das coisas mais legais sobre Python % &ue' como uma linguagem orientada a ob(eto'
ela obriga o desenvolvedor a pensar em termos de abstra)*o e modulari+a)*o de c,digo
en&uanto est- escrevendo c,digo' o &ue resulta em aplica).es limpas e melhor
empacotadas. /ntretanto' empacotar seu c,digo em 0un).es % simplemente o come)o1
Python tamb%m te permite criar cole).es de 0ragmentos de c,digo compartilhado' ou
2m,dulos3' &ue podem ser importados e usados por &ual&uer programa Python.
Poderosos' 0le45veis e muito interessantes' os m,dulos podem ser uma das mais potentes
armas no arsenal do desenvolvedor Python... desde &ue eles se(am usados corretamente.
6o curso deste artigo' eu estarei e4plorando um dos m,dulos mais 7teis de Python' o
m,dulo MySQdb. 8 m,dulo MySQdb permite aos desenvolvedores conectar seu
c,digo Python a um servidor de banco de dados MySQ' e4ecutar comandos SQ nele' e
trans0ormar os dados resultantes em um 0ormato utili+-vel...e isso vem a calhar &uando
voc9 come)ar a desenvolver aplica).es Python com banco de dados. Mas n*o acredite nas
minhas palavras ! ve(a por voc9 mesmo:
6as palavras do seu autor' MySQdb % 2uma inter0ace compat5vel com threads para o
popular servidor de banco de dados MySQ &ue 0ornece a AP; de banco de dados
Python.2 Desenvolvido por Andy Dustman' este m,dulo % necess-rio para a conectividade
com MySQ atrav%s do Python.
A primeira coisa a 0a+er % ter certe+a &ue voc9 tem o m,dulo MySQdb instalado em seu
sistema de desenvolvimento Python. A maneira mais 0-cil para checar isso % atrav%s do
interpletador interativo de linha de comando Python como o e4emplo seguinte
demonstra:
Python 2.3.3 (#1, May 12 2004, 22:56:21)
[GCC 3.3.3] on linux2
Ty! "#oy$i%ht", "#$!&it'" o$ "li#!n'!()" (o$ )o$! in(o$)ation.
*** i)o$t My+,-&.
T$a#!.a#/ (inn!$)o't la't):
0il! "1't&in*", lin! 1, in 2
3)o$t4$$o$: 5o )o&ul! na)!& My+,-&.
***
Se voc9 est- vendo alguma coisa parecida com a mensagem de erro acima' voc9 pode
assumir seguramente &ue o m,dulo n*o est- instalado no seu sistema. <- at%
http://source0orge.net/pro(ects/mys&l!python' bai4e a 7ltima c,pia do m,dulo MySQdb'
e4traia e instale no seu sistema.
6 ta$ 7x89( My+,-7ython70.:.2.ta$.%8
6 #& My+,-7ython70.:.2
6 ython '!tu.y .uil&
6 ython '!tu.y in'tall
Agora' voc9 pode veri0icar se o m,dulo 0oi instalado tentando import-!lo novamente pela
linha de comando.
Python 2.3.3 (#1, May 12 2004, 22:56:21)
[GCC 3.3.3] on linux2
Ty! "#oy$i%ht", "#$!&it'" o$ "li#!n'!()" (o$ )o$! in(o$)ation.
*** i)o$t My+,-&.
***
6enhum problema desta ve+ o &ue signi0ica &ue n,s podemos continuar para escrever
um pouco de c,digo.
"om isso 0ora do caminho' a&ui est- um simples e4emplo &ue demonstra um pouco da
0uncionalidade do D=;. "onsidere a tabela seguinte do banco de dados'
)y';l* +4-4CT < 0=>M ani)al'?
@777777777@7777777777@
A na)! A '!#i!' A
@777777777@7777777777@
A Balla#! A Bal$u' A
A Polly A Pa$$ot A
A 0$!&&i! A 0$o% A
A Tu'/!$ A 4l!hant A
A +a))y A +/un/ A
@777777777@7777777777@
5 $oC' in '!t (0.01 '!#)
e ent*o considere este pe&ueno script Python' &ue conecta ao banco de dados e imprime
os dados da tabela.
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# 4x!#uta o +,-
#u$'o$.!x!#ut!("+4-4CT < 0=>M ani)al'")
# P!%a o $!'ult'!t #o)o u)a tula
$!'ult G #u$'o$.(!t#hall()
# 3t!$a (na9!%a) !lo $!'ult'!t
(o$ $!#o$& in $!'ult:
$int $!#o$&[0] , "77*", $!#o$&[1]
A maioria deste c,digo % 0-cil de entender >sel0!e4planatory?' mas de &ual&uer 0orma'
dei4e!me ir atrav%s dele com voc9.
8 primeiro passo % importar o m,dulo MySQdb' atrav%s da 0un)*o 2import2 do Python.
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
Assim &ue acabar' voc9 pode abrir uma cone4*o com o MySQ passando para o m%todo
connect>? do m,dulo uma s%rie de par@metros de cone4*o o nome do servidor' o nome
do usu-rio do banco de dados' a senha e o nome do banco de dados.
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
$ma cone4*o e0etuada com sucesso retorna um ob(eto "onnection' &ue voc9 pode usar
para criar um cursor.
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
/ste cursor % necess-rio para e4ecutar uma consulta SQ e para recuperar o resultset
gerado.
# 4x!#uta o +,-
#u$'o$.!x!#ut!("+4-4CT < 0=>M ani)al'")
# !%a o $!'ult'!t #o)o u)a tula
$!'ult G #u$'o$.(!t#hall()
Alguns m%todos est*o dispon5veis para recuperar o resultset da consulta o m%todo
utili+ado a&ui % o 0etchall>?' &ue retorna uma tupla de tuplas' cada tupla interna representa
uma linha do resultset. /sta tupla pode ent*o ser iterada usando um simples loop 20or2' e
os seus elementos impressos para a sa5da padr*o.
# 3t!$a (na9!%a) !lo $!'ult'!t
(o$ $!#o$& in $!'ult:
$int $!#o$&[0] , "77*", $!#o$&[1]
<oc9 tamb%m pode usar o m%todo 0etchone>? do ob(eto cursor para pegar e listar uma
linha de cada ve+' ao inv%s de tudo de uma ve+. "onsidere o seguinte e4emplo' &ue
demonstra como isso deve 0uncionar:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# 4x!#uta o +,-
#u$'o$.!x!#ut!("+4-4CT < 0=>M ani)al'")
# P!%a o nI)!$o &! linha' no $!'ult'!t
nu)$oC' G int(#u$'o$.$oC#ount)
# -i'ta u)a linha &! #a&a 9!8
(o$ x in $an%!(0,nu)$oC'):
$oC G #u$'o$.(!t#hon!()
$int $oC[0], "77*", $oC[1]
6este caso' o m%todo rowcount>? do ob(eto cursor % primeiramente usado para encontrar o
n7mero de linhas no resultset. /ste n7mero % ent*o usado em um loop 20or2 para iterar o
resultset' com o m%todo 0etchone>? usado para mover atrav%s do resultset e
se&uencialmente listar o conte7do de cada linha.
<oc9 pode 0a+er com &ue o MySQdb lhe de um subset espec50ico de um resultset com o
m%todo 0etchmany>? do ob(eto cursor' &ue lhe permite especi0icar o tamanho do resultset
retornado. "onsidere o seguinte e4emplo' &ue demonstra:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# 4x!#uta o +,-
#u$'o$.!x!#ut!("+4-4CT < 0=>M ani)al'")
# -i)ita o $!'ult'!t a$a 3 it!n'
$!'ult G #u$'o$.(!t#h)any(3)
# 3t!$a (na9!%a) !lo $!'ult'!t
(o$ $!#o$& in $!'ult:
$int $!#o$&[0] , "77*", $!#o$&[1]
8bviamente' voc9 tamb%m pode e4ecutar consultas de inser)*o' atuali+a)*o e e4clus*o
atrav%s do m,dulo MySQdb. "onsidere o e4emplo seguinte:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# #on!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# 4x!#uta o +,-
#u$'o$.!x!#ut!("""35+4=T 35T> ani)al' (na)!, '!#i!') JK-L4+ ("Ma$$y",
"Ma)'t!$")""")
<oc9 pode modi0icar isto para &ue os valores da string de consulta se(am inseridos pelo
usu-rio d9 uma olhada nesta variante do e4emplo acima:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# P!%a a !nt$a&a &o u'uN$io
na)! G $aCOinut("Pl!a'! !nt!$ a na)!: ")
'!#i!' G $aCOinut("Pl!a'! !nt!$ a '!#i!': ")
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# 4x!#uta o +,-
#u$'o$.!x!#ut!("35+4=T 35T> ani)al' (na)!, '!#i!') JK-L4+ (P', P')",
(na)!, '!#i!'))
Desta ve+' &uando voc9 e4ecutar o script' voc9 ser- perguntado pelos valores para serem
inseridos no banco de dados.
Pl!a'! !nt!$ a na)!: =ollo
Pl!a'! !nt!$ a '!#i!': =at
6ote a maneira com a &ual as vari-veis 0oram integradas na consulta SQ do e4emplo
acima. 8 s5mbolo ABs3 % usado para representar cada vari-vel na string de consulta' com
os valores atuais guardados em uma tupla e passados como um segundo argumento.
6o caso de voc9 ter campos auto!incremento no seu banco de dados' voc9 pode usar o
m%todo insertCid>? do ob(eto cursor para obter o ;D do 7ltimo registro inserido isso vem
a calhar &uando voc9 est- lidando com tabelas ligadas em um banco de dados relacional
>DD=MS?' pois os ;Ds rec%m inseridos de uma tabela 0re&uentemente servem como
chaves para outras tabelas. 8 seguinte snippet >script Python ! hehehe? deve demonstrar
como isso 0unciona:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# 4x!#uta o +,-
#u$'o$.!x!#ut!("""35+4=T 35T> t!'t ((i!l&1, (i!l&2) JK-L4+ ("9al1",
"9al2")""")
# P!%a o 3Q &o Ilti)o $!%i't$o in'!$i&o
$int "3Q o( in'!$t!& $!#o$& i' ", int(#u$'o$.in'!$tOi&())
Muitos scripts de banco de dados envolvem preparar uma 7nica consulta >de ;6S/DEF8'
por e4emplo? e e4ecut-!la v-rias ve+es com valores di0erentes. MySQdb vem com o
m%todo e4ecutemany>?' &ue simpli0ica este trabalho e tamb%m pode redu+ir despesas de
per0ormance.
Para entender como isso 0unciona' considere o seguinte e4emplo' &ue demonstra:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# G!$a #on'ulta' +,- &inR)i#a' a a$ti$ &a li'ta
#u$'o$.!x!#ut!)any("35+4=T 35T> ani)al' (na)!, '!#i!') JK-L4+ (P',P')",
[ (S=olloS, S=atS), (SQu&l!yS, SQolhinS), (SMa$/S, SMa$)o'!tS)
])
6este caso' a mesma consulta % repedita v-rias ve+es' com um grupo di0erente de valores
de cada ve+. 8s valores de cada itera)*o s*o passados para o m%todo e4ecutemany>? como
uma lista Python1 cada elemento da lista % uma tupla contendo os valores para cada
itera)*o.
$sando esta t%cnica' % poss5vel escrever um script &ue pede para o usu-rio para entrar
uma s%rie de valores de dados' e ent*o inserir todos eles no banco de dados de um golpe
s, usando o m%todo e4ecutemany>?. ;sso % 0eito a&ui em bai4o:
#DEu'$E.inEython
# 3)o$ta o )F&ulo &o My+,-
i)o$t My+,-&.
# 3ni#iali8a al%u)a' 9a$iN9!i'
na)! G ""
&ata G []
# 4nt$a !) u) loo ! !&! a !nt$a&a &o u'uN$io
Chil! (1):
na)! G $aCOinut("Pl!a'! !nt!$ a na)! (4>0 to !n&): ")
i( na)! GG "4>0":
.$!a/
'!#i!' G $aCOinut("Pl!a'! !nt!$ a '!#i!': ")
# Colo#a$ a !nt$a&a &o u'uN$io !) u)a tula
tul! G (na)!, '!#i!')
# 4 in'!$! na li'ta &! &a&o'
&ata.a!n&(tul!)
# Con!#ta
&. G My+,-&..#onn!#t(ho'tG"lo#alho't", u'!$G"Ho!", a''C&G"'!#$!t",
&.G"&.56a")
# C$ia u) #u$'o$
#u$'o$ G &..#u$'o$()
# G!$a #on'ulta' +,- &inT)i#a' a a$ti$ &a li'ta &! &a&o'
#u$'o$.!x!#ut!)any("35+4=T 35T> ani)al' (na)!, '!#i!') JK-L4+ (P',P')",
&ata)
6este caso' um la)o 2while2 % usado continuamente para pegar a entrada do usu-rio' com
cada grupo de valores inseridos sendo empacotados em uma tupla e sendo adicionados
para a lista de dados. Depois &ue o usu-rio terminar de inserir todos os dados' o m%todo
e4ecutemany>? % usado na combina)*o com os v-rios valores inseridos pelo usu-rio' para
;6S/D;D os valores dentro do banco de dados.
Alguns outros m%todos &ue vem com a classe MySQdb a&ui est- uma pe&uena lista
dos m%todos mais 7teis:
connection.begin>? ! ;nicia uma cone4*o
connection.apilevel>? ! Detorna o n5vel da D= AP; corrente
connection.conv>? ! "on0igure as op).es de convers*o de tipos MySQ e Python
connection.commit>? ! D- um commit na transa)*o
connection.rollbacG>? ! D- um roll bacG na transa)*o
/ isso % tudo por agora. 6este artigo' eu lhe mostrei como con0igurar e instalar o m,dulo
MySQdb do Python' e utili+-!lo para ligar seus scripts Python com um servidor de
banco de dados MySQ. /u demonstrei as di0erentes t%cnicas para iterar em um resultset'
mostrei o b-sico de como usar vari-veis e consultas preparadas' e ilustrei alguns dos
m%todos contidos neste m,dulo.
Mesmo &ue este tutorial consiga 0a+er com &ue voc9 0a)a scripts com Python e MySQ'
voc9 n*o deveria parar de ler agora. A&ui est*o alguns linGs &ue merecem ser checados:
A p-gina do pro(eto MySQdb no SourceHorge' em http://source0orge.net/pro(ects/mys&l!
python
A p-gina do Python' em http://www.python.org/
A p-gina do MySQ' em http://www.mys&l.com/
At% a pr,4ima ve+...se(a bon+inho:
6ota: Iodos os e4emplo deste artigo 0oram testados em um inu4/iJKJ com Python L.M.M'
MySQ N.O.Oa e MySQdb P.Q.L. /4amplos s*o meramente ilustrativos' e n*o 0oram
pro(etados para um ambiente de produ)*o. Melon0ire n*o d- nenhuma garantia ou suporte
ao 0onte distribu5do neste artigo. RMM<:

Você também pode gostar