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<: