Você está na página 1de 5

26/03/14

Portal Frum 7Masters

IntegrityError: a duplicao de valores das chaves viola a restrio nica |


Ferramentas Cursosonline Agenda RevistaiMasters InterCon FaaLogin/Cadastrese

+de12.000artigostcnicospublicadosem13anos

Faasuabusca

DESIGN&UX

FRONTEND

DEV

BD

MOBILE

MARKETING

GESTO

APIS

SEARCH

INFRA

TECH

ECOMMERCE

ANALYTICS

Vocestaqui:

Tweetar

Like

Share

DJANGO

IntegrityError: a duplicao de valores das chaves viola a restrio nica


20desetembrode2011porMarkvanLent
AdfromVimeoDownloadVideos[X]

Comocomeou
Quandoeuestavadesenvolvendoumaaplicaoweb emDjango,crieiummodeloparaarmazenarendereos.Euestavausandoesses endereoscomdoisobjetivos:pagamentoeentrega.Omodelodeendereotinha oscamposnormais(rua,CEPetc),eomodelodoperfilsepareciacomisto: c l a s sP r o f i l e ( m o d e l s . M o d e l ) : . . . s h i p p i n g _ a d d r e s s=m o d e l s . F o r e i g n K e y ( A d d r e s s ,r e l a t e d _ n a m e = ' s h i p p i n g ' ) b i l l i n g _ a d d r e s s=m o d e l s . F o r e i g n K e y ( A d d r e s s ,r e l a t e d _ n a m e = ' b i l l i n g ' ) Tudo estavacertoatqueavalidaoparaosendereostinhaqueserdiferentepara oendereodopagamentoedeentrega.(Caixasdecorreioerampermitidasparao endereodepagamento,masnoparaodeentrega). Decidicriardoismodelosdiferentes(Adresse BillingAddressEndereoeEndereodePagamento),ambosherdandodeuma classe debaseabstrata (BaseAddress).Omodelodoperfilmudouparausarestesmodelos:

LTIMASNOTCIAS
26/03S05H40

Googledevecolocarmais recursosdeseguranano Android


26/03S04H35

WordPresspassaaretirar formataodotextocoladodireto doWord


26/03S04H00

ReceitaFederaldosEstados Unidosfechaasportaspara bitcoin

c l a s sP r o f i l e ( m o d e l s . M o d e l ) : 26/03S03H40 . . . Pesquisadoresdesenvolvem s h i p p i n g _ a d d r e s s=m o d e l s . F o r e i g n K e y ( A d d r e s s ,r e l a t e d _ n a m e = ' s h i p p i n g ' ) b i l l i n g _ a d d r e s s=m o d e l s . F o r e i g n K e y ( B i l l i n g A d d r e s s ,r e l a t e d _ n a m e = ' b i l l i n g ' ) plataformaantiespionagempara

Migrao
Infelizmente, essamudanafoifeitadepoisqueositeestavanoar,entoeuprecisava migrarobancodedados.EujestavausandooSouthparalidarcomasmigraesdo

aInternet
26/03S02H30

imasters.com.br/artigo/22037/django/integrityerror-a-duplicacao-de-valores-das-chaves-viola-a-restricao-unica/

1/5

26/03/14

IntegrityError: a duplicao de valores das chaves viola a restrio nica |

banco,ento eunoestavamuitopreocupado.Apesardeamaioriadoscasosdemigrao criadospeloSouthfuncionarembem,estaprecisavadeintervenomanual. A migraoconsistiaem4passos: 1. Criarumatabelaparao modeloBillingAddress. 2. Copiartodososendereosde pagamentoparaatabelamodeloBillingAddress. 3. Mudaratabelamodelodo perfilparaterrefernciasparaomodeloBillingAddress. 4. Removerosendereosdepagamento databelamodelodeendereos.. Para facilitaraminhavida,decidiquenosegundopassoeuiriaapenascopiaroID dosendereosantigosparaonovoBillingAddress.Dessamaneira,eunoteria queatualizarcadaperfilparaapontarparaonovoBillingAddress.Umpouco bruto,talvez,masefetivo. Inicialmente,tudopareceufuncionar.Amigrao funcionoubem,eaaplicaoaindafuncionava.Todosestavamfelizeseeusegui paraumatarefadiferente.Ateureceberumerrodoisdiasdepois:

Samsungconfirmachegadado GalaxyS5aoBrasilnodia11de abrilporR$2.599


TODASASNOTCIAS

FindusonFacebook

iMasters
Like

95,277peoplelikeiMasters.

Facebooksocialplugin

undefined

I n t e g r i t y E r r o r :d u p l i c a t ek e yv a l u ev i o l a t e su n i q u ec o n s t r a i n t" p r o f i l e _ b i l l i n g a d d r e s s _ p k e y " Como mostraoerro,aaplicaoestavatentandocriarumBillingAddresscomumID quejexistia.

Oqueaconteceu?
ODjangotem umbomORMqueabstraitodosostiposde coisascomasquaisvocnoquersepreocupar.Porexemplo:anoserquevoc especifiquediferentedisso,ummodelotemumcampodepreenchimentodeID automtico queumaumachaveprimriaautoincrementvel.E,como especificadonadocumentao,notemjeitodesaberqualserovalordeum IDantesdevocsalvar(),porqueessevalorcalculadopeloseubancodedados,no peloDjango. Poralgum motivo,oPostgreSQLestavacalculandooIDerradoaoarmazenaroBillingAddress. Eletinhaqueestarrelacionadonossarecentemigrao.Masporqueeunovi issoduranteostestes?Eporqueissosomentecomeouaocorrerdepoisdedois dias? Depoisdeprocurarumpouco,descobria existnciadealgumassequnciasdoPostgreSQL.Olhandoparatrs,umaprimeira dicapoderiatersidoencontradaaoolharpeloSQLgeradopeloDjango: $m a n a g es q lp r o f i l e . . . C R E A T ET A B L E" p r o f i l e _ b i l l i n g a d d r e s s "( " i d "s e q u e n c eN O TN U L LP R I M A R YK E Y , . . . Quando inspecioneiobancodedados,eutivemaisinformaessobreasequncia: $m a n a g ed b s h e l l d b = >d s S c h e m a| L i s to fr e l a t i o n s N a m e | T y p e |O w n e r

imasters.com.br/artigo/22037/django/integrityerror-a-duplicacao-de-valores-das-chaves-viola-a-restricao-unica/

2/5

26/03/14

IntegrityError: a duplicao de valores das chaves viola a restrio nica |

+ + + . . . |. . . |. . . |. . . p u b l i c|p r o f i l e _ b i l l i n g a d d r e s s _ i d _ s e q |s e q u e n c e|m a r k d b = >dp r o f i l e _ b i l l i n g a d d r e s s _ i d _ s e q S e q u e n c e" p u b l i c . p r o f i l e _ b i l l i n g a d d r e s s _ i d _ s e q " C o l u m n | T y p e | V a l u e + + s e q u e n c e _ n a m e|n a m e |p r o f i l e _ b i l l i n g a d d r e s s _ i d _ s e q l a s t _ v a l u e |b i g i n t |6 s t a r t _ v a l u e |b i g i n t |1 i n c r e m e n t _ b y |b i g i n t |1 m a x _ v a l u e |b i g i n t |9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 m i n _ v a l u e |b i g i n t |1 c a c h e _ v a l u e |b i g i n t |1 l o g _ c n t |b i g i n t |2 8 i s _ c y c l e d |b o o l e a n|f i s _ c a l l e d |b o o l e a n|f Ea estavaomeuproblema:olast_valueera6,enquantoexistiammuitomais endereosnobancodedados.Aoinspecionaratabelarelacionada (profile_billingaddress) logodepoisdeamigraotersidofeita,constateiqueosIDsutiizadosforam7, 9,12,14,16etc.IssofoioresultadodaminhadecisodecopiarosIDsda tabeladeendereosoriginal. Ento quandoosprimeirosseisnovosBillingAddressesforamcriados,eutivesorte,pois elestinhamumnicoID(1at6).porissoqueeunotinhadescobertoo problemamaiscedo:euapenasconfirmeiqueamigraotinhafuncionadodepois deadicionaralguns(menosque7)novosBillingAddresses.

Asoluo
Comoo casonamaioriadasvezes:umavezquevocdescobriuacausadoproblema,a soluosetornatrivial.Nessecaso,eutinhaapenasqueconfigurarolast_value dasequnciacomoomaisaltoIDdatabela. Escolhiasoluorpidaesujaparacriaruma novaevaziamigrao: $m a n a g es c h e m a m i g r a t i o np r o f i l ef i x _ s e q u e n c e _ p r o b l e me m p t y Ento adicioneiestecdigoparaomtodoforwards: i fo r m . B i l l i n g A d d r e s s . o b j e c t s . c o u n t ( ) : h i g h e s t _ n u m b e r=d b . e x e c u t e ( ' s e l e c ti df r o mp r o f i l e _ b i l l i n g a d d r e s so r d e rb yi dd e s cl i m i t1 ; ' ) [ 0 ] [ 0 ] d b . e x e c u t e ( ' a l t e rs e q u e n c ep r o f i l e _ b i l l i n g a d d r e s s _ i d _ s e qr e s t a r tw i t h% s ; '%( h i g h e s t _ n u m b e r+1 ) ) Provavelmente eupoderiaterconfiguradoasequnciaparaonmeromaisalto,masescolhi incrementarcomumamaissparagarantirqueeunotivesseumerro sporum.AsegundalinhafalhasenoexistirumBillingAddresses,ento,para prevenirquemeustestesfalhassem,euchequeiaexistnciadeBillingAddresses explicitamente. Depois queexecuteiessamigraonoambientedeproduo,osusuriospodiamcriar perfisnovamentesemacionarumIntegrityError. ? Textooriginaldisponvelemhttp://www.vlent.nl/weblog/2011/05/06/integrityerror duplicatekeyvalueviolatesuniqueconstraint/

imasters.com.br/artigo/22037/django/integrityerror-a-duplicacao-de-valores-das-chaves-viola-a-restricao-unica/

3/5

26/03/14

IntegrityError: a duplicao de valores das chaves viola a restrio nica |

Artigosrelacionados
Oobjetoadminde umapp
Django

Fazendointegrao entreDjangoe GoogleMaps


Django,Tecnologia

Oobjetomodelsde umapp
Django

5comentrios Comente!

Comente!

MarkvanLent consultortcnicoeprogramadordaEdition1,esualinguagemde programaofavoritaoPython. PginadoautorEmail LeiaosltimosartigospublicadosporMarkvanLent

IntegrityError:aduplicaodevaloresdaschavesviolaarestrio nica

1COMENTRIO

COMENTETAMBM

GabrielAlanPereira EudesistideaprenderDjangodepoisquemeBANIRAMdogrupodogooglesem aomenoseuENVIARUMEMAILSEQUER. AcomunidadeDJANGOmedecepcionoubastante

H2anos Responder

QUALASUAOPINIO?

Escrevaseucomentrioaqui...

Twitter
Siga o perfil do iMasters

LinkedIn
Cadastre-se no grupo iMasters

gitHub
Cdigos iMasters DEV

RSS
Assine os feeds

imasters.com.br/artigo/22037/django/integrityerror-a-duplicacao-de-valores-das-chaves-viola-a-restricao-unica/

4/5

26/03/14

IntegrityError: a duplicao de valores das chaves viola a restrio nica |

SOCIALMEDIA
Copyright2014Todososdireitosreservados

NEWSLETTER
Fiquepordentrodetodasasnovidades, eventos,cursos,contedosexclusivose muitomais.

SobreoiMasters PolticadePrivacidade Faleconosco

faleconosco@imasters.com.br

Seunome Seuemail ENVIAR

imasters.com.br/artigo/22037/django/integrityerror-a-duplicacao-de-valores-das-chaves-viola-a-restricao-unica/

5/5

Você também pode gostar