0
votes

Insertion de tableaux dans des bases de données

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))


2 commentaires

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 .


4 Réponses :


-1
votes

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()


6 commentaires

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 doit être cité et échappé. Et vérifiez que num_qs> 0 . 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 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



0
votes

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.

Source: Site SQLite Site Web https://www.sqlite.org/dataType3.html


1 commentaires

Je pense qu'ils veulent mapper la matrice sur plusieurs colonnes.



0
votes

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 (?, ?, ?, ?)


0 commentaires

0
votes

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 à .

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) (voici un Exemple de insertion / mise à jour).


0 commentaires