Deutsch   English   Français   Italiano  
<87a6hhsse2.fsf@universite-de-strasbourg.fr.invalid>

View for Bookmarking (what is this?)
Look up another Usenet article

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 <alain@universite-de-strasbourg.fr.invalid>
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: <CAOdnZ2m4f_MZTT8nZ2dnUU7983NnZ2d@giganews.com>
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 <nospam_olivier.debeyssac@gmail.com.invalid> 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.