這是我的觸發器
cursor.execute(
'''CREATE TRIGGER IF NOT EXISTS Car_Park_row_
BEFORE INSERT ON Car_Park
WHEN (SELECT COUNT(*) FROM Car_PARK) >= 10
BEGIN
SELECT RAISE (ABORT, 'FULL');
END;
這是我的功能
def C(x):
print('Error')
# Create Database
connector = sqlite3.connect('cparks.db')
connector.create_function("sql", -1, C)
cursor = connector.cursor()
我已使用觸發器將資料庫中的行數限制為 10。我現在需要的是一個訊息框或類似的東西,讓 GUI 用戶知道該表已滿。
uj5u.com熱心網友回復:
在查詢中執行函式會在 Python 代碼中RAISE()引發例外,您可以像處理任何其他例外一樣處理該例外。sqlite3.IntegrityError
示例腳本:
import sqlite3
db = sqlite3.connect(':memory:')
db.executescript('''
CREATE TABLE car_park (car);
CREATE TRIGGER car_park_row
BEFORE INSERT ON car_park
WHEN (SELECT count(*) FROM car_park) >= 10
BEGIN
SELECT RAISE (ABORT, 'full');
END;
''')
for i in range(15):
car = f'car{i}'
try:
res = db.execute('insert into car_park values (?)', (car,))
except sqlite3.IntegrityError as e:
print(f'Could not insert {car}: {e}')
for row in db.execute('SELECT * FROM car_park'):
print(row)
輸出:
Could not insert car10: full
Could not insert car11: full
Could not insert car12: full
Could not insert car13: full
Could not insert car14: full
('car0',)
('car1',)
('car2',)
('car3',)
('car4',)
('car5',)
('car6',)
('car7',)
('car8',)
('car9',)
(如果發生錯誤,可能建議break跳出回圈,這里不做只是為了演示。)
您可以在例外處理程式中呼叫任何 Python 函式,而不是列印錯誤訊息。您不需要向資料庫添加用戶定義的函式來執行此操作:
def handle_insert_car_error(car, error):
create_message_box(f'Could not insert {car}: {error}') # or whatever
然后:
# ...
try:
res = db.execute('insert into car_park values (?)', (car,))
except sqlite3.IntegrityError as e:
handle_insert_car_error(car, e)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/410115.html
標籤:
