python вставить данные в таблицу sqlite3

#python #python-3.x #sqlite

#python #python-3.x #sqlite

Вопрос:

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

 def add_item(self, item):
    stmt = "INSERT INTO users (id) VALUES (?)"
    args = (item,)
    self.conn.execute(stmt, args)
    self.conn.commit()
  

Это работает нормально, но позволяет мне записывать данные только в столбец id. Как я могу сделать эту функцию динамической, чтобы я мог добавлять любые данные в любой столбец?

 # new variable to specify column to write to

def add_item(self, item, column):
    stmt = "INSERT INTO users (column) VALUES (?)"
    args = (item,)
    self.conn.execute(stmt, args)
    self.conn.commit()
  

Ответ №1:

Вам необходимо динамически создавать список имен столбцов и заполнителей значений на основе предоставленных списков столбцов и значений.

Это можно сделать с помощью str.join, однако вам может потребоваться обработать случай, когда вызывающий объект передает одну строку в качестве имени столбца и одного значения.

 def add_item(self, values, columns):
    # Check for single column insert
    if isinstance(columns, str):
        values, columns = (values,), (columns,)
    assert len(values) == len(columns), 'Mismatch between values and columns'

    template = """INSERT INTO users ({}) VALUES ({})"""

    cols = ','.join([f'"{col}"' for col in columns])
    placeholders = ','.join(['?'] * len(values))
    stmt = template.format(cols, placeholders)

    self.conn.execute(stmt, values)
    self.conn.commit()
    return
  

Комментарии:

1. Спасибо. мне действительно нужна фиксация или это автоматическая фиксация?

2. Автоматическая фиксация отключена по умолчанию, но вы можете установить для isolation_level атрибута соединения значение None или передать isolation_level=None конструктору соединения. Смотрите документы по управлению транзакциями .