J'essaie d'écrire une fonction générale qui insérera une ligne de données dans une table dans une base de données, mais j'essaie d'écrire un tableau de longueur inconnue. Je vis simplement à pouvoir appeler cette fonction dans n'importe quel programme et écrivez une ligne de données de n'importe quelle longueur à la table (en supposant que la table et que la matrice est la même longueur.
J'ai essayé d'ajouter le tableau comme c'est un Singular morceau de données. P>
import sqlite3
def add2Db(dbName, tableName, data):
connection = sqlite3.connect(dbName)
cur = connection.cursor()
cur.execute("INSERT INTO "+ tableName +" VALUES (?)", (data))
connection.commit()
connection.close()
add2Db("items.db", "allItems", (1, "chair", 5, 4))
4 Réponses :
Changer votre fonction à ceci:
def add2Db(dbName, tableName, data):
num_qs = len(data)
qm = ','.join(list('?' * num_qs))
query = """
INSERT INTO {table}
VALUES ({qms})
""".format(table=tableName,
qms=qm)
connection = sqlite3.connect(dbName)
cur = connection.cursor()
cur.execute(query, data)
connection.commit()
connection.close()
Est-ce vulnérable à une attaque d'injection SQL?
pourrait dépendre de l'affaire d'utilisation, mais celle-ci est applicable s'il accepte les commentaires des sources extérieures, il n'a pas indiqué que
Tableau code> doit être cité et échappé. Et vérifiez que num_qs> 0 code>. Sinon, je pense que ça va.
Si vous souhaitez injecter le nom de la table en toute sécurité, j'utiliserais la substitution de paramètres et psycopg2.extensions.asis code> mais une fois encore, nous ne connaissons pas le contexte, donc pour répondre à la question ici, je pense que cela suffira
Si vous ne connaissez pas que le code de contexte doit être utilisé, il est préférable de supposer que les données sont sales. Et simplement parce qu'une fonction est passée des paramètres propres aujourd'hui, cela ne signifie pas que ce sera demain. Au minimum, définissez vos présomptions de sécurité dans la réponse.
Je ne vais pas assumer quoi que ce soit, la question a été posée et elle a été répondue, vous lui avez dit les préoccupations de sécurité sur le poste d'origine dans un commentaire, il n'est pas nécessaire que je puisse répéter que
sqlite ne prend pas en charge les tableaux - vous devez convertir en texte à l'aide de ",". Joindre () pour rejoindre vos éléments de matrice en une seule chaîne et passer cela. P>
Source: Site SQLite Site Web https://www.sqlite.org/dataType3.html P>
Je pense qu'ils veulent mapper la matrice sur plusieurs colonnes.
Je ne suis pas un programmeur Python, mais je fais une longue période de SQL. J'ai même écrit mon propre orme. Mon conseil est d'écrire votre propre constructeur de requêtes SQL. Il y a une myriade de questions subtiles et en particulier des problèmes de sécurité. J'élabore quelques-uns d'entre eux ci-dessous.
Au lieu de cela, utilisez un constructeur de requêtes SQL bien établi ou un orj. Ils ont déjà traité ces questions. Voici un exemple en utilisant SQLALCHEMY . P>
insert into users
(name, birthday, state, country)
values (?, ?, ?, ?)
Vous ne devriez pas essayer d'écrire votre propre orateur sans avoir besoin d'un besoin argumenté. Vous aurez beaucoup de problèmes, par exemple ici, voici rapide 25 raisons pas à . p>
Utilisez plutôt n'importe quel orme populaire qui est prouvé. Je recommande d'utiliser SQLalchemy comme une tâche à l'extérieur de Django. Utilisation de celui-ci, vous pouvez mapper un dict de valeurs pour l'insérer dans un modèle juste comme insert (schema_name) .values (** dict_name) code> (voici un Exemple de insertion / mise à jour). P>
Plutôt que d'écrire le vôtre, il est mieux résolu avec une bibliothèque de constructeurs SQL existante ou une orje complète telle que SQLALCHEMY .
Il y a aussi une préoccupation de sécurité; Ce que vous écrivez est susceptible d'être vulnérable à un Attaque d'injection SQL .