вставлять без ошибок, но не вставлять. + более интуитивно понятный синтаксис? - PullRequest
0 голосов
/ 20 марта 2020

Я хочу вставить данные в таблицу, созданную с помощью SQLite. Большая часть кода конвертирует мои массивы в одну строку для con.excute (). Может в этом проблема? Есть ли способ лучше? Ошибка не возвращается.

def add_row(table, columns, values):
    con = sql_connection("database.db")
    cursorObj = con.cursor()
    # column list to string
    if isinstance(columns, list) == True:
        columns = ", ".join(columns)
    # wrap each string in list with '' and convert whole list to string
    if isinstance(values, list) == True:
        for i in range(0, len(values)):
            if isinstance(values[i], str) == True:
                values[i] = "'" + values[i] + "'"
        values = ", ".join(values)
    try:
        cmd = "insert into " + table + "(" + columns + ") values (" + values + ")"
        print(cmd)
        cursorObj.execute(cmd)
    except sqlite3.Error as e:
        print("An error occurred:", e.args[0])

add_row("Stocks", ["symbol", "name"], ["TEST", "test"])

вывод на печать (cmd):

insert into Stocks (symbol, name) values ('TEST', 'test')

РАЗЪЯСНЕНИЕ: меня не волнуют проблемы безопасности. Он будет использоваться только локально.

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Я понял это. Обратите внимание на то, что сказали другие: такая общая функция не должна использоваться в сети, поскольку делает базу данных уязвимой для атак SQL инъекций. Тем не менее, моя база данных является и всегда будет локальной.

def add_row(table, columns, values):
    valueArr = []
    if (len(columns) == len(values)) == False:
        print("Values and columns must be of equal length")
        return
    columns = ", ".join(columns)
    for value in values:
        valueArr.append("?")
    valueArr = ", ".join(valueArr)
    with sqlite3.connect("database.db") as con:
        try:
            cursor = con.cursor()
            cmd = "insert into " + table + " (" + columns + ")  values (" + valueArr + ")"
            print("cmd", cmd)
            cursor.execute(cmd,
                           values)
        except sqlite3.Error as e:
            print("An error occurred:", e.args[0])

add_row("Stocks", ["symbol", "name", "exchange"], ["AAPL", "Apple", "NASDAQ"])
0 голосов
/ 20 марта 2020

Я не рекомендую пытаться обобщить эту функцию для произвольных таблиц и столбцов.

def add_symbol_and_name(symbol, name):
    with sqlite3.connect("database.db") as con:
        cursor = con.cursor()
        cursor.execute("insert into Stocks (symbol, name) values (?, ?)",
                       (symbol, name))

Что-нибудь более динамичное c, чем это, открывает вам до SQL атак инъекций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...