как я могу передать как int, так и строковые значения для выполнения UPDATE таблицы - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу передать строковое значение и целочисленное значение в sqlite3, выполнить команду UPDATE

, num переменная должна быть Int type, а ans переменная должна быть String type чтобы я мог правильно изменить содержимое таблицы.

таблица:

q_conn = sqlite3.connect('questions_stack.db')
q_c = q_conn.cursor()
q_c.execute("""CREATE TABLE IF NOT EXISTS questions (
            id INTEGER PRIMARY KEY,
            topic TEXT,
            username TEXT,
            subject TEXT,
            body TEXT,
            likes INTEGER,
            comments TEXT)                  
            """)

здесь я пытаюсь UPDATE определенный столбец определенной строки: def update_comments ():

    q_c.execute("""SELECT comments FROM questions WHERE id = ?""", (int(num),))
    previous_comments = q_c.fetchone()
    q_c.execute("""UPDATE questions SET comments = ? WHERE id = ?""",
            (str(previous_comments) + "\n" + str(ans), int(num)))
    q_conn.commit()

однако в моей таблице базы данных questions sqlite3 сделанное мной обновление столбца comments выглядит так:

(u'',)
comment1

и когда функция update_comments() вызывается снова, столбец комментариев содержит:

(u"(u'',)\ncomment1",)
comment2

в чем проблема? и как я могу это исправить? это как-то связано с тем, что я передал в команду значения INT и STRING?

1 Ответ

1 голос
/ 15 апреля 2020

Проблема в том, что этот оператор:

previous_comments = q_c.fetchone()

назначает кортеж , а не строку. Этот кортеж состоит из одного элемента - изначально пустой строки, потому что именно так вы инициализируете свою базу данных - но все же это кортеж, и когда вы вызываете str() для нее, вы получаете строку, представляющую кортеж, ie. (u'',).

Правильный способ сделать это:

(previous_comments,) = q_c.fetchone()

или

previous_comments = q_c.fetchone()[0]

, чтобы previous_comments было присвоено строковое значение. Да, и вызов str() для строки избыточен, так что вы можете упростить это:

q_c.execute("""UPDATE questions SET comments = ? WHERE id = ?""",
        (str(previous_comments) + "\n" + str(ans), int(num)))

до:

q_c.execute("""UPDATE questions SET comments = ? WHERE id = ?""",
        (previous_comments + "\n" + ans, int(num)))
...