Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sqlite3 assemblage d'une requête sql

5 réponses
Avatar
Francois Lafont
Bonjour à tous,

Pouvez-vous me dire pourquoi ceci ne fonctionne pas ?

#-------------------------------------
#! /usr/bin/python
# -*- coding:Utf-8 -*-

import sqlite3

file_path = "test.sq3"
table_name = "test"

connection = sqlite3.connect(file_path)
cursor = connection.cursor()

t = (table_name,)
cursor.execute("""CREATE TABLE ? (id INTEGER PRIMARY KEY ASC, nom TEXT,
age INTEGER)""", t)
connection.commit()

cursor.close()
connection.close()
#-------------------------------------

J'obtiens comme erreur "sqlite3.OperationalError: near "?": syntax
error". Je comprends bien qu'il y a un problème avec ma requête sql,
mais je me suis inspiré de cette page
http://docs.python.org/library/sqlite3.html (troisième exemple de code).

Si je remplace ma requête par ceci :

cursor.execute("""CREATE TABLE %s (id INTEGER PRIMARY KEY ASC, nom TEXT,
age INTEGER)""" % t)

tout marche, mais justement dans la page que j'ai citée, il est dit de
ne surtout pas faire comme ça.

Merci d'avance pour votre aide.


--
François Lafont

5 réponses

Avatar
yves
Le Sun, 08 Aug 2010 18:01:28 +0200, Francois Lafont a écrit:

Bonjour,

Tout marche, mais justement dans la page que j'ai citée, il est dit de
ne surtout pas faire comme ça.



De ceci:

http://groups.google.com/group/comp.lang.python/browse_thread/
thread/50a8ad977ed31e2a

je comprends que l'utilisation de ? ne fonctionne pas avec les noms de
table.

Il semble qu'il n'y ait un risque potentiel que si c'est l'utilisateur
final qui fournit les paramêtres.
Veux-tu vraiment que l'utilisateur final fournisse les noms des tables ?

@+
--
Yves
Avatar
Mickaël Wolff
Le 09/08/2010 02:10, yves a écrit :
Il semble qu'il n'y ait un risque potentiel que si c'est l'utilisateur
final qui fournit les paramêtres.
Veux-tu vraiment que l'utilisateur final fournisse les noms des tables ?



Si l'utilisateur final est le DBA, c'est un besoin pertinent ;)

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
News123
On 08/09/2010 03:10 AM, yves wrote:
Le Sun, 08 Aug 2010 18:01:28 +0200, Francois Lafont a écrit:

Bonjour,

Tout marche, mais justement dans la page que j'ai citée, il est dit de
ne surtout pas faire comme ça.



De ceci:

http://groups.google.com/group/comp.lang.python/browse_thread/
thread/50a8ad977ed31e2a

je comprends que l'utilisation de ? ne fonctionne pas avec les noms de
table.

Il semble qu'il n'y ait un risque potentiel que si c'est l'utilisateur
final qui fournit les paramêtres.
Veux-tu vraiment que l'utilisateur final fournisse les noms des tables ?




Je croix pour le noms de table, c'est a toi de fair l'escaping.

pour eviter l'injection de sql tu pourras creer un liste de tout les
tables existantes et prendre seulement un index pour choissir la table.

pour creer une liste de tables:
SELECT * FROM dbname.sqlite_master WHERE type='table'
Avatar
Francois Lafont
Merci pour vos réponses.

En fait, c'est moi qui choisis le nom de la table et pas l'utilisateur
donc en effet je peux faire ceci :

cursor.execute("""CREATE TABLE %s (id INTEGER PRIMARY KEY ASC, nom TEXT,
age INTEGER)""" % t)

Le nom de la base (qui n'a pas grande importance ici, mon script est une
petite bidouille perso) intervient à plusieurs reprises dans le code et
le formatage de chaîne est un peu lourd.

Comment fait-on en Python pour gérer les constantes magiques (comme on
pourrait le faire en C avec un #define) ?


--
François Lafont
Avatar
News123
On 08/09/2010 04:25 PM, Francois Lafont wrote:
Merci pour vos réponses.

En fait, c'est moi qui choisis le nom de la table et pas l'utilisateur
donc en effet je peux faire ceci :

cursor.execute("""CREATE TABLE %s (id INTEGER PRIMARY KEY ASC, nom TEXT,
age INTEGER)""" % t)

Le nom de la base (qui n'a pas grande importance ici, mon script est une
petite bidouille perso) intervient à plusieurs reprises dans le code et
le formatage de chaîne est un peu lourd.

Comment fait-on en Python pour gérer les constantes magiques (comme on
pourrait le faire en C avec un #define) ?




Pas de #define en python donc

ou au debut d'un module python

TABLE_NAME = "mytable"

CREATE_TABLE_QRY = """CREATE TABLE %s (id INTEGER PRIMARY KEY ASC,
nom TEXT, age INTEGER)"""


ou definir les foncions