python sqlite3 условный запрос - PullRequest
       0

python sqlite3 условный запрос

0 голосов
/ 12 февраля 2020

Таблица Sqlite3

CREATE TABLE t (
    id INTEGER PRIMARY KEY,
    p1 INTEGER NOT NULL,
    p2 INTEGER NOT NULL,
    p3 INTEGER NOT NULL
)
INSERT INTO t (1, 11, 12, 13)

Python

def update(id, p1=None, p2=None, p3=None):
    db = self.get_db()
    db.execute('UPDATE t SET p1=?, p2=?, p3=? WHERE id=?', (p1, p2, p3, id))

Когда я использую update(1, 3, 4, 5), это работает, но при обновлении (1, 3, 4) это дает мне Error: NOT NULL constraint failed: t.p3 что нормально, потому что я должен сделать

if not p3:
    db.execute('UPDATE t SET p1=?, p2=? WHERE id=?', (p1, p2, id))

Можно ли сделать это довольно просто?

например:

stm = db.prep('UPDATE t SET')
if p1:
    stm.append('p1=?', p1)
if p2:
    stm.append('p2=?', p2)
if p3:
    stm.append('p3=?', p3)
stm.append('WHERE id=?', id)

1 Ответ

1 голос
/ 12 февраля 2020

Это был бы самый простой способ, который я могу себе представить:

def update(self, object_id, p1=None, p2=None, p3=None):  # don't use id as a variable name
    db = self.get_db()
    # if any of the parameters are None, set the new value to what it was already
    db.execute('UPDATE t SET p1=ifnull(?, p1), p2=ifnull(?, p2), p3=ifnull(?, p3) WHERE id=?', (p1, p2, p3, object_id))

Лично я бы использовал ORM вместо raw SQL из соображений безопасности.

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