#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
конструктору соединения. Смотрите документы по управлению транзакциями .