如何在 sqlite 数据库中找到引用 key/id
How to find the reference key/id in a sqlite database
所以我试图找出使用 sqlite 数据库的正确方法,但我觉得在涉及到 Key/ID 部分时我完全弄错了。
我确定这个问题之前已经被问过并在某个地方得到了回答,但我还没有找到它,所以就在这里。
根据我目前收集到的信息,我应该使用 Key/ID 来引用 table 中的条目,对吗?
因此,如果 table A 有一个 ID 为 1 的条目,然后是几列数据,那么 table B 使用 table A 中的 ID 1 来访问该数据。
我可以做到,只要我已经知道 Key/ID.
我不明白的是如果我还不知道该怎么做。
考虑以下代码:
import sqlite3
conn = sqlite3.connect("./DB")
conn.execute("""CREATE TABLE IF NOT EXISTS Table_A (
A_id INTEGER NOT NULL PRIMARY KEY UNIQUE,
A_name TEXT
)""")
conn.execute("""CREATE TABLE IF NOT EXISTS Table_B (
B_id INTEGER NOT NULL PRIMARY KEY UNIQUE,
B_name TEXT,
B_A_id INTEGER
)""")
conn.execute("""INSERT INTO Table_A (A_name) VALUES ('Something')""")
conn.commit()
我现在想向 Table_B 添加一个条目,并让它引用我刚刚在 B_A_id 列中创建的条目。
我该怎么做?
我不知道 Key/ID 是什么,我只知道 A_name 列中有 'Something'。我可以在不查询 'Something' 或直接检查数据库的情况下找到它吗?因为感觉有点倒退。
我是做错了还是漏掉了什么?
可能是我太笨了。
您不需要知道 Table_A
中的 A_id
。
您只需要 A_name
列的值,假设它是 'Something'
,您想在 Table_B
中引用它,您可以这样做:
INSERT INTO Table_B (B_name, B_A_id)
SELECT 'SomethingInTableB', A_Id
FROM Table_A
WHERE A_name = 'Something'
或:
INSERT INTO Table_B (B_name, B_A_id) VALUES
('SomethingInTableB', (SELECT A_Id FROM Table_A WHERE A_name = 'Something'))
您的方向是正确的,但是 运行 遇到了问题,即 Connection.execute()
函数实际上是创建游标并使用它执行查询的快捷方式。要在 Table_A
中检索新行的 ID,请显式创建游标,并访问 lastrowid
属性,例如:
c = conn.cursor()
c.execute("""INSERT INTO Table_A (A_name) VALUES ('Something')""")
print(c.lastrowid) # primary key (A_id) of the new row
有关 Connection
和 Cursor
对象的更多信息,请参阅 python sqlite3 documentation。
所以我试图找出使用 sqlite 数据库的正确方法,但我觉得在涉及到 Key/ID 部分时我完全弄错了。 我确定这个问题之前已经被问过并在某个地方得到了回答,但我还没有找到它,所以就在这里。
根据我目前收集到的信息,我应该使用 Key/ID 来引用 table 中的条目,对吗?
因此,如果 table A 有一个 ID 为 1 的条目,然后是几列数据,那么 table B 使用 table A 中的 ID 1 来访问该数据。 我可以做到,只要我已经知道 Key/ID.
我不明白的是如果我还不知道该怎么做。
考虑以下代码:
import sqlite3
conn = sqlite3.connect("./DB")
conn.execute("""CREATE TABLE IF NOT EXISTS Table_A (
A_id INTEGER NOT NULL PRIMARY KEY UNIQUE,
A_name TEXT
)""")
conn.execute("""CREATE TABLE IF NOT EXISTS Table_B (
B_id INTEGER NOT NULL PRIMARY KEY UNIQUE,
B_name TEXT,
B_A_id INTEGER
)""")
conn.execute("""INSERT INTO Table_A (A_name) VALUES ('Something')""")
conn.commit()
我现在想向 Table_B 添加一个条目,并让它引用我刚刚在 B_A_id 列中创建的条目。 我该怎么做?
我不知道 Key/ID 是什么,我只知道 A_name 列中有 'Something'。我可以在不查询 'Something' 或直接检查数据库的情况下找到它吗?因为感觉有点倒退。
我是做错了还是漏掉了什么? 可能是我太笨了。
您不需要知道 Table_A
中的 A_id
。
您只需要 A_name
列的值,假设它是 'Something'
,您想在 Table_B
中引用它,您可以这样做:
INSERT INTO Table_B (B_name, B_A_id)
SELECT 'SomethingInTableB', A_Id
FROM Table_A
WHERE A_name = 'Something'
或:
INSERT INTO Table_B (B_name, B_A_id) VALUES
('SomethingInTableB', (SELECT A_Id FROM Table_A WHERE A_name = 'Something'))
您的方向是正确的,但是 运行 遇到了问题,即 Connection.execute()
函数实际上是创建游标并使用它执行查询的快捷方式。要在 Table_A
中检索新行的 ID,请显式创建游标,并访问 lastrowid
属性,例如:
c = conn.cursor()
c.execute("""INSERT INTO Table_A (A_name) VALUES ('Something')""")
print(c.lastrowid) # primary key (A_id) of the new row
有关 Connection
和 Cursor
对象的更多信息,请参阅 python sqlite3 documentation。