如何检索插入id后插入行在SQLite使用Python?我有一个这样的表格:
id INT AUTOINCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)
我插入一个新行,使用示例数据用户名="test"和密码="test"。如何以事务安全的方式检索生成的id ?这是一个网站解决方案,其中两个人可能同时插入数据。我知道我可以得到最后一个读行,但我不认为这是事务安全的。谁能给我一些建议?
如何检索插入id后插入行在SQLite使用Python?我有一个这样的表格:
id INT AUTOINCREMENT PRIMARY KEY,
username VARCHAR(50),
password VARCHAR(50)
我插入一个新行,使用示例数据用户名="test"和密码="test"。如何以事务安全的方式检索生成的id ?这是一个网站解决方案,其中两个人可能同时插入数据。我知道我可以得到最后一个读行,但我不认为这是事务安全的。谁能给我一些建议?
你可以使用光标。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
如果两个人同时在插入,只要他们使用不同的游标,游标。Lastrowid将返回游标插入的最后一行的id:
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
注意,当你使用executemany一次插入多行时,lastrowid返回None:
cursor.executemany('INSERT INTO foo (username,password) VALUES (?,?)',
(('baz','bar'),('bing','bop')))
print(cursor.lastrowid)
# None
所有功劳都归功于@Martijn Pieters在评论中:
你可以使用函数last_insert_rowid():
last_insert_rowid()函数返回调用该函数的数据库连接中最后一行插入的ROWID。last_insert_rowid() SQL函数是sqlite3_last_insert_rowid() C/ c++接口函数的包装器。
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