【问题标题】:SQLite and python - can't set primary keysSQLite 和 python - 无法设置主键
【发布时间】:2021-03-05 09:38:18
【问题描述】:

我正在尝试使用 python 创建表,但是当我检查 SQLite 中的数据结构时,没有分配主键。这是其中一张表的代码。除了主键部分外,它似乎按预期工作。我是 Python 和 SQLite 的新手,所以我可能遗漏了一些非常明显但找不到任何答案的东西。

# Create a database and connect
conn = sql.connect('Coursework.db')
c = conn.cursor()

# Create the tables from the normalised schema
c.execute('CREATE TABLE IF NOT EXISTS room_host (room_ID integer PRIMARY KEY, host_ID integer)')


c.execute("SELECT count(name) from sqlite_master WHERE type='table' AND name='room_host'")
if c.fetchone()[0] == 1:
    c.execute("DROP TABLE room_host")
else:
    c.execute('CREATE TABLE room_host (room_ID integer PRIMARY KEY, host_ID integer)')

conn.commit()

# read data from csv

read_listings = pd.read_csv('listings.csv')
room_host = pd.DataFrame(read_listings, columns=['id', 'host_id'])
room_host.set_index('id')
room_host.to_sql("room_host", conn, if_exists='append', index=False)

c.execute("""INSERT INTO room_host (id, host_ID)
SELECT room_host.id, room_host.host_ID
FROM room_host
""")

【问题讨论】:

  • 为什么先建表然后又马上删除?
  • 我明白了……整个中间部分带有“表存在检查”似乎不是很有用,删除它。 “如果不存在则创建表”足以添加一个表。但它不会覆盖现有表。因此,如果 room_host 在之前的尝试中已经存在,并且它确实 not 有主键,那么这不会添加主键。事先删除表以确保它是从头开始创建的。
  • 我不确定您是否找对地方了?如果表被创建(即当你运行 CREATE TABLE 语句时没有错误),那么它肯定会有一个主键。那么......是什么让你认为它没有?
  • 从 SQL 中删除“IF NOT EXISTS”。会发生什么?
  • 只有 一种 方式表没有主键,即它的创建方式与您显示的方式不同,并且您正在查看的 CREATE TABLE 语句永远不会实际运行。运行我的答案中的代码,独立(为什么你还没有到目前为止?)

标签: python sql database sqlite


【解决方案1】:

我无法用主键重现该问题,当我运行该 SQL 语句时,该表已按预期创建。

除此之外,实际上不需要绕过 Pandas,csv 模块加上 .executemany() 在我看来是一种将数据从 CSV 加载到表中的更直接的方式。

import csv
import sqlite3 as sql

conn = sql.connect('Coursework.db')

conn.executescript('CREATE TABLE IF NOT EXISTS room_host (room_ID integer PRIMARY KEY, host_ID integer)')
conn.commit()

with open('listings.csv', encoding='utf8', newline='') as f:
    reader = csv.reader(f, delimiter=',')
    conn.executemany('INSERT INTO room_host (room_ID, host_ID) VALUES (?, ?)', reader)
    conn.commit()

【讨论】:

  • 谢谢。他希望我们使用熊猫。我不知道我没有分配主键是怎么回事。我想我可以直接在 SQLite 中创建表并解释原因。
  • @champion_bake 如果必须,您可以继续使用 Pandas,这无关紧要。举个例子,我通常会尝试消除复杂性,pandascsv 模块复杂得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2021-06-13
相关资源
最近更新 更多