python - 我的 python sqlite 更新语句没有提交
问题描述
我正在尝试编写一些 Python SQLite3 CRUD 语句。我想我的更新语句写得正确,但显然有一个我看不到的问题。语句执行,但数据库不更新。Insert 和 Read 语句工作正常。我省略了 create database 和 db_insert() 函数,因为它们正在工作......
我的代码:
import sqlite3 as sql
def db_read():
try:
conn = sql.connect(database_file)
c = conn.cursor()
with conn:
c.execute("SELECT * FROM netdevices")
result = c.fetchall()
conn.commit()
return result
except:
print("Database Read Error")
print(traceback.format_exc())
def db_update(record_id, ip_address, device_name, connection_type, username, password):
try:
conn = sql.connect(database_file)
c = conn.cursor()
with conn:
sql_cmd = "UPDATE netdevices SET ip_address = @ip_address, device_name = @device_name, connection_type = @connection_type, username = @username, password = @password WHERE id=@record_id"
sql_values = [record_id, ip_address, device_name, connection_type, username, password]
c.execute(sql_cmd, sql_values)
conn.commit()
print('Database Update Successful')
except:
print("Database Update Error")
print(traceback.format_exc())
db_insert(1, '10.10.10.1', 'Gateway', 'ssh', 'cisco', 'cisco')
db_insert(2, '10.10.10.2', 'WorkshopSwitch', 'telnet', 'cisco', 'cisco')
print('READ: ' + str(db_read()))
print('-------')
db_update(2, '10.10.10.250', 'WorkshopSwitch', 'ssh', 'admin', 'P@ssw0rd1') # Update not working???
print('-------')
print('READ: ' + str(db_read()))
它给出了这个输出:
Database Insert Successful
Database Insert Successful
READ: [(1, '10.10.10.1', 'Gateway', 'ssh', 'cisco', 'cisco'), (2, '10.10.10.2', 'WorkshopSwitch', 'telnet', 'cisco', 'cisco')]
-------
Database Update Successful
-------
READ: [(1, '10.10.10.1', 'Gateway', 'ssh', 'cisco', 'cisco'), (2, '10.10.10.2', 'WorkshopSwitch', 'telnet', 'cisco', 'cisco')]
如您所见,未进行更新。也许我通过非常简单的尝试遗漏了一些 SQL 错误:除了:语句?
提前感谢您的建议。
解决方案
我无意中找到了答案:)
sql_values 数组需要与语句中的@variables 的顺序相同。
我在 UPDATE 语句的末尾有 id=@record_id 但在数组中首先列出。
Python 像旧式字符串格式一样按顺序匹配变量,而不是寻找 @variable 并匹配数组中的相同变量。
错误:
sql_cmd = "UPDATE netdevices SET ip_address = @ip_address, device_name = @device_name, connection_type = @connection_type, username = @username, password = @password WHERE id=@record_id"
sql_values = [record_id, ip_address, device_name, connection_type, username, password,]
正确的:
sql_cmd = "UPDATE netdevices SET ip_address = @ip_address, device_name = @device_name, connection_type = @connection_type, username = @username, password = @password WHERE id=@record_id"
sql_values = [ip_address, device_name, connection_type, username, password, record_id]
推荐阅读
- c# - WPF 从具有双向绑定的 ViewModel 中选择 DataGrid 中的多个项目
- mysql - mysql 表很少,一个大表上的子查询执行缓慢
- firebase - firebase 中的 queryReference 和 querySnapshot 有什么区别?
- azure-active-directory - Android MSAL 配置和授权 URL
- visual-studio-code - VS Code 使用了错误的 Python 解释器
- r - 如果值出现在特定行中,则返回 3 下一行和上一行
- google-cloud-platform - 根据 GCP Cloud SQL 日志创建报告
- python - BertForTokenClassification 未加载
- javascript - s3 存储桶的清漆代理无法使用 URL 中的参数对 REST 调用进行签名
- python - 使用 argparse 的无名子解析器