如何使用 Python 在 SQLite 中插入行后检索插入的 id?
- 2025-03-05 09:16:00
- admin 原创
- 82
问题描述:
如何使用 Python 在 SQLite 中插入行后检索插入的 ID?我有这样的表格:
id INT AUTOINCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)
我插入了一个包含示例数据username="test"
和的新行password="test"
。如何以事务安全的方式检索生成的 ID?这是一个网站解决方案,其中两个人可能同时插入数据。我知道我可以获取最后读取的行,但我认为这不是事务安全的。有人可以给我一些建议吗?
解决方案 1:
您可以使用cursor.lastrowid(参见“可选的 DB API 扩展”):
connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,
username varchar(50),
password varchar(50))''')
cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',
('test','test'))
print(cursor.lastrowid)
# 1
如果两个人同时插入,只要他们使用不同的cursor
,cursor.lastrowid
就会返回插入的id
最后一行cursor
:
cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',
('blah','blah'))
cursor2=connection.cursor()
cursor2.execute('INSERT INTO foo (username,password) VALUES (?,?)',
('blah','blah'))
print(cursor2.lastrowid)
# 3
print(cursor.lastrowid)
# 2
cursor.execute('INSERT INTO foo (id,username,password) VALUES (?,?,?)',
(100,'blah','blah'))
print(cursor.lastrowid)
# 100
请注意,当您一次插入多行时lastrowid
会返回:None
`executemany`
cursor.executemany('INSERT INTO foo (username,password) VALUES (?,?)',
(('baz','bar'),('bing','bop')))
print(cursor.lastrowid)
# None
解决方案 2:
评论中的所有内容均归功于@Martijn Pieters :
您可以使用该功能last_insert_rowid()
:
该
last_insert_rowid()
函数返回调用ROWID
该函数的数据库连接中插入的最后一行。SQLlast_insert_rowid()
函数是 C/C++ 接口函数的包装器sqlite3_last_insert_rowid()
。
SQLite 3.35的RETURNING
条款:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT
);
INSERT INTO users (first_name, last_name)
VALUES ('Jane', 'Doe')
RETURNING id;
INSERT
返回、UPDATE
和语句中插入行的请求列DELETE
。Python 用法:
cursor.execute('INSERT INTO users (first_name, last_name) VALUES (?,?)'
' RETURNING id',
('Jane', 'Doe'))
row = cursor.fetchone()
(inserted_id, ) = row if row else None
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD