Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.python > #3662

Re: Fonction Python et MySQL, pour créer une clé étrangère

From Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid>
Newsgroups fr.comp.lang.python
Subject Re: Fonction Python et MySQL, pour créer une clé étrangère
Date 2021-12-03 14:57 +0100
Organization Université de Strasbourg
Message-ID <87a6hhsse2.fsf@universite-de-strasbourg.fr.invalid> (permalink)
References <CAOdnZ2m4f_MZTT8nZ2dnUU7983NnZ2d@giganews.com>

Show all headers | View raw


Olivier92410 <nospam_olivier.debeyssac@gmail.com.invalid> writes:

[...]
> Ci-dessous, une partie du dictionnaire utilisé, pour rester simple:
> d_fk = {'Bien_Immo': ['fk_Id_Lot', 'Lot', 'Id']}
>
> Puis la fonction,
> def create_fk(name1, name2, name3, name4):
>     url = "e;mysql+pymysql://{user}:{password}@localhost/{db}"e;
>     engine = create_engine(url.format(user='root', password='...',
> db='data_immo'))

Ce n'est pas une bonne idée 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}({name4})"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] = [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] = [d_fk[key][0], d_fk[key][1], d_fk[key][2]]
>         create_fk(key, n2, n3, n4)


1) Autant itérer sur les couples clé/valeur plutôt que de multiplier les
accès au dictionnaire
2) Il est inutile de créer 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 = val[i][0], val[i][1], val[i][2]
            create_fk(key, n2, n3, n4)
    else:
        n2, n3, n4 = 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 = {'Bien_Immo': [('fk_Id_Lot', 'Lot', 'Id')]}

Dans ce cas tu peux écrire

for key, val in d_fk.items():
    for n2, n3, n4 in val:
        create_fk(key, n2, n3, n4)

-- Alain.

Back to fr.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Fonction Python et MySQL, pour cr�er une cl� �trang�re Olivier92410 <nospam_olivier.debeyssac@gmail.com.invalid> - 2021-12-03 04:58 -0600
  Re: Fonction Python et MySQL, pour créer une clé étrangère Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> - 2021-12-03 14:57 +0100
  Re: Fonction Python et MySQL, pour créer une clé étrangère Nicolas <nicolasp@aaton.com> - 2021-12-06 10:33 +0100

csiph-web