Оператор обновления не работает на sqlite3 с использованием Python - PullRequest
0 голосов
/ 19 сентября 2018

Я медленно схожу с ума.Я не могу понять, почему я не могу заставить этот оператор обновления работать, когда я использую строку из input ().Этот первый раздел работает отлично:

table_name = 'ARCHIVE_BOXES'
column_name = 'status'
id_column = 'id'

c.execute("UPDATE {tn} SET {cn}=('reading') WHERE {idf}=(566)".
        format(tn=table_name, cn=column_name, idf=id_column))

conn.commit()

Но это не так, и я два дня бился головой о стену:

table_name = 'ARCHIVE_BOXES'
column_name = 'status'
id_column = 'id'
pk = ''
while not pk:
    pk = input()
    pk = ("(" + pk + ")")
    primary_key = pk

ns = ''
while not ns:
    ns = input()
    new_status = ("\'" + ns + "\'")
    new_status = ("(" + new_status + ")")

    print("new_status: " + new_status)

c.execute("""
    UPDATE
        {tn}
    SET
        {cn} = ?
    WHERE
        {idf} = ?""".
        format(tn=table_name, cn=column_name, idf=id_column),
        (new_status, primary_key))

conn.commit()

Я тоже пытался делатьоператор обновления таким образом имеет тот же результат:

c.execute("UPDATE {tn} SET {cn}={ns} WHERE {idf}={idn}".
           format(tn=table_name, cn=column_name2, idf=id_column,
           ns=new_status, idn=primary_key))

Как и этот вопрос , он не выдает ошибку - просто полностью ее игнорирует.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Зачем ставить новые значения статуса и первичного ключа между апострофами и круглыми скобками?

Просто получите входные данные и соберите их в кортеж, определенный в операторе execute.

Если conn это ваш объект подключения, вы также можете использовать его метод execute напрямую, не определяя объект курсора.

Вы также можете использовать менеджер контекста для фиксации ваших изменений, только если исключение не существуетне был поднят (см. очень интересную документацию модуль Python sqlite3 ).Вам не нужно явно объявлять оператор commit.

primary_key = ''
while not primary_key:
    primary_key = input()
    # or primary_key = int(input())

new_status= ''
while not new_status:
    new_status = input()

conn = sqlite3.connect("your_database")
with conn:
    conn.execute("UPDATE {tn} SET {cn}=? WHERE {idf}=?".format(tn=table_name, cn=column_name, idf=id_column), (new_status, primary_key))

Это работает лучше?

0 голосов
/ 19 сентября 2018

Ваш первичный ключ, вероятно, является целым числом, но в основном коде (не во фрагменте) вы передаете ему строку с круглыми скобками как часть строки.Поэтому в основном коде запрос будет содержать WHERE id_column='(566)' и просто не будет совпадать ни с одной записью.

Попробуйте:

while not pk:
    pk = input()
    primary_key = int(pk)

и посмотрите, будет ли это работать лучше.

Заполнитель ? в запросе SQL будет автоматически помещать кавычки в строки, а не в числа, поэтому вам нужно убедиться, что передаваемые параметры имеют правильный тип.

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