Path: ...!weretis.net!feeder6.news.weretis.net!feeder8.news.weretis.net!news.mixmin.net!aioe.org!Faqf6A55NG1s8DSVkh3L9A.user.46.165.242.75.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: Fonction Python et MySQL, pour =?utf-8?Q?cr=C3=A9er?= une =?utf-8?B?Y2zDqSDDqXRyYW5nw6hyZQ==?= Date: Fri, 03 Dec 2021 14:57:25 +0100 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Message-ID: <87a6hhsse2.fsf@universite-de-strasbourg.fr.invalid> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: gioia.aioe.org; logging-data="54512"; posting-host="Faqf6A55NG1s8DSVkh3L9A.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org"; User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:Wy1az/mQUA7tkkzB5V2nF32aHnw= Bytes: 3428 Lines: 65 Olivier92410 writes: [...] > Ci-dessous, une partie du dictionnaire utilis=C3=A9, pour rester simple: > d_fk =3D {'Bien_Immo': ['fk_Id_Lot', 'Lot', 'Id']} > > Puis la fonction, > def create_fk(name1, name2, name3, name4): > url =3D "e;mysql+pymysql://{user}:{password}@localhost/{db}"e; > engine =3D create_engine(url.format(user=3D'root', password=3D'...', > db=3D'data_immo')) Ce n'est pas une bonne id=C3=A9e de poster un mot de passe sur Usenet. > engine.execute(f"e;ALTER TABLE {name1}"e; > f"e;ADD COLUMN {name2},"e; > f"e;ADD CONSTRAINT {name2}"e; > f"e;ADD FOREIGN KEY ({name2}) REFERENCES {name3}({name= 4})"e; > f"e;ON DELETE CASCADE"e;) [...] > Ce code retourne une erreur de syntaxe 1064, Note que ce n'est pas une erreur Python. (Et ce n'est effectivement pas la syntaxe de MySQL, il n'y a pas de ADD avant FOREIGN KEY -- voir la doc.) > for key in d_fk.keys(): > if isinstance(d_fk[key][0], list): > for i in range(len(d_fk[key])): > [n2, n3, n4] =3D [d_fk[key][i][0], d_fk[key][i][1], d_fk[key]= [i][2]] > create_fk(key, n2, n3, n4) > else: > [n2, n3, n4] =3D [d_fk[key][0], d_fk[key][1], d_fk[key][2]] > create_fk(key, n2, n3, n4) 1) Autant it=C3=A9rer sur les couples cl=C3=A9/valeur plut=C3=B4t que de mu= ltiplier les acc=C3=A8s au dictionnaire 2) Il est inutile de cr=C3=A9er des listes dans les affectations for key, val in d_fk.items(): if isinstance(val[0], list): for i in range(len(val)): n2, n3, n4 =3D val[i][0], val[i][1], val[i][2] create_fk(key, n2, n3, n4) else: n2, n3, n4 =3D val[0], val[1], val[2] create_fk(key, n2, n3, n4) (items() en Python 3, iteritems() en Python 2). Et utiliser soit un triplet soit une liste de triplets ne fait que compliquer le code -- on peut utiliser une liste de longueur 1 dans le premier cas, et en faire des triplets/tuples au lieu de listes, p.ex. d_fk =3D {'Bien_Immo': [('fk_Id_Lot', 'Lot', 'Id')]} Dans ce cas tu peux =C3=A9crire for key, val in d_fk.items(): for n2, n3, n4 in val: create_fk(key, n2, n3, n4) -- Alain.