python3 pysqlite et paramétres Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Bonjour les pythoneux.
Je n'arrive pas à comprendre comment passet des paramétres à cursort.execute, par exemple pour insérer des valeurs.
Passer la valeur à insérer un paramètre, ça fonctionne

Code : Tout sélectionner

param = (ident,)
c.execute ("""INSERT INTO "identifiant" ("identifiant") VALUES (?);""",param) 
OK, avoir le même nom pour la table et la colonne, c'est pas bien ...
Mais je n'arrive pas à passer en paramétre le nom de la table et/ou le nom de la colonne.
J'ai vu qu'il y avait 2 façons de passer les paramètres, le ? ou le dico, mais je n'arrive à rien
Et en plus, lje n'arrive pas à accéder aux exemples de la doc.
https://github.com/ghaering/pysqlite/bl ... qlite3.rst
.. method:: Cursor.execute(sql, [parameters])

Executes an SQL statement. The SQL statement may be parametrized (i. e.
placeholders instead of SQL literals). The :mod:`sqlite3` module supports two
kinds of placeholders: question marks (qmark style) and named placeholders
(named style).

This example shows how to use parameters with qmark style:

.. literalinclude:: ../includes/sqlite3/execute_1.py

This example shows how to use the named style:

.. literalinclude:: ../includes/sqlite3/execute_2.py
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

j'ai enfin un accés correct à la doc
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("create table people (name_last, age)")

who = "Yeltsin"
age = 72

# This is the qmark style:
cur.execute("insert into people values (?, ?)", (who, age))

# And this is the named style:
cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})
Il semblerait qu'on ne puisse pas passer en paramètre la table ou le colonne afin d'éviter les injections SQL
J'ai trouvé un contournement, mais je ne l'ai pas encore compris

Code : Tout sélectionner

cur.execute('SELECT * FROM test ORDER BY {order_by} ASC'.format(order_by='age'))
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

cet exemple est plus parlant et facile à comprendre

Code : Tout sélectionner

c.execute("INSERT INTO {tn} ({idf}, {cn}) VALUES (123456, 'test')".\
        format(tn=table_name, idf=id_column, cn=column_name))
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

Merci Mips, mais c'est une réponse à l'autrre fil!
Pour mon probléme de requete sqlite, je n'y comprends plus rien. en utilisant.format

Code : Tout sélectionner

    c.execute ("""INSERT INTO "identifiant" ("identifiant") VALUES ({});""".format("toto"))
sqlite3.OperationalError: no such column: toto
Pourquoi il cherche la colonne "toto"? Je lui est spécifié en toute lettre la colonne "identifiant" !
MicP
Modérateur
Modérateur
Messages : 896
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Merci Mips, mais c'est une réponse à l'autrre fil!
:082:
je me suis effectivement trompé de fil,
désolé. :005:

Je vais déplacer mon précédent message.
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

J'ai enfin trouvé, il faut mettre

Code : Tout sélectionner

VALUES ("{}")
les "" change tout ....
Avatar de l’utilisateur
vohu
Membre
Membre
Messages : 455
Inscription : 16 avr. 2016, 12:02
Localisation : Strasbourg
Status : Hors-ligne

Tu as beaucoup de tables dans ton programme ? Parceque si c'est le cas il est intéressant de passer par sqlalchemy. Ça te permet de manipuler des objets python plutôt que de faire des requêtes :
https://docs.sqlalchemy.org/en/latest/orm/tutorial.html
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

non, ça reste assez simple, j'ai pris une table sqlite.
et du coup, je révise le langage SQL!
A la base; c'est géré dans un dossier xls, comme souvent en entreprise ...
Répondre