提问人:Xayyna 提问时间:11/10/2023 最后编辑:Xayyna 更新时间:11/10/2023 访问量:35
在创建表时在 sqlite3 中指定列会自动使其与众不同吗?
Does specifying a column in sqlite3 while creating a table automatically make it distinct?
问:
所以我有一个数据库,里面有购买记录,每条记录都有很多列,包括购买者的ID和他们的姓名。 如果我想只为客户创建一个新表,我会这样做:
Purchasedf = pd.read_csv('Purchase.csv')
conn = sqlite3.connect('Purchase.db')
cursor = conn.cursor()
#The Client table
cursor.execute('''
CREATE TABLE IF NOT EXISTS Client (
CustomerID INTEGER PRIMARY KEY UNIQUE,
CustomerName TEXT,
CustomerEmail TEXT,
CustomerPhone TEXT
);
''')
Purchasedf.to_sql("Client", conn, if_exists='replace')
cursor.execute('''
SELECT CustomerID
FROM Client
''')
display(cursor.fetchall())
conn.commit()
所以我的csv文件看起来像这样: 第一行: PurchaseID、CustomerID、CustomerName、CustomerEmail、CustomerPhone、ProductID、Purchase_Date
第二排: 1,6145,伊桑·史密斯,[email protected],555-087834,8513,2024-10-07 16:33:28.557244
现在,如果我尝试从客户端选择 CustomerID,我会得到重复的 ID。 我怎样才能使它们与众不同?我的意思是我知道我可以清楚地选择它们,但是 (PRIMARY KEY) 关键字不应该使实际表与 ID 不同吗?
答:
2赞
Schwern
11/10/2023
#1
Client 表在上一次运行中已存在,并且其 CustomerID 不是唯一的。
因为您正在运行 ,并且您没有删除表,所以第一次运行代码将创建一个表。据推测,该表没有主键。create table if not exists
后续运行将忽略 你的 ,因为它已经存在,并重用现有表。它不会更改架构。create table
现在,每次运行代码时,都会插入重复项。
您可以通过在 SQLite shell 中运行来检查。.schema Client
此类问题在生产代码中使用架构迁移工具进行处理。
评论
0赞
Xayyna
11/10/2023
即使我删除了以前的数据库并重新运行,它仍然会给出重复的 id。
0赞
Xayyna
11/10/2023
我实际上尝试打印我的客户端表,它打印了数据帧中的所有列?
0赞
Xayyna
11/10/2023
unique_clients_df = BookingDetailsDf[['CustomerID', 'CustomerName', 'CustomerEmail', 'CustomerPhone']].drop_duplicates() # Write the unique client information to the Client table unique_clients_df.to_sql("Client", conn, if_exists="replace", index=False)
我最终这样做了,但我必须再做几张这样的桌子,这不是多余的吗?或者这是处理类似事情的正确方法吗?
1赞
Schwern
11/11/2023
@Xayyna 1) 说什么?它是否显示 CustomerID 是主键?2)对不起,我不知道该代码是做什么的。如果您询问是否应该在每次运行程序时重新创建表,这取决于您要完成的任务。.schema Client
0赞
Xayyna
11/11/2023
否,它显示 Client 表包含大数据库中的所有列。我试图用一个 csv 文件制作不同的表,我发现为每个表制作一个单独的数据帧是最好的方法。
评论
JOIN