将csv导入sqlite3插入失败

时间:2018-06-07 07:31:33

标签: csv sqlite

我正在尝试将nodes.csv文件导入sqlite3表 - link to file

这是我的代码 -

CREATE TABLE nodes (
    id INTEGER PRIMARY KEY NOT NULL,
    lat REAL,
    lon REAL,
    user TEXT,
    uid INTEGER,
    version INTEGER,
    changeset INTEGER,
    timestamp TEXT
);

.import nodes.csv nodes

我设法在没有主键指定的情况下导入此文件,但是一旦我将主键添加到id字段,它就会出现以下错误

nodes.csv:xxx: INSERT failed: datatype mismatch

表示文件中xxx是行号的每一行。我是sqlite3的新手,非常感谢您对此事的见解。

2 个答案:

答案 0 :(得分:1)

CSV文件包含字符串。您不能将字符串插入整数列。 (通常是SQLite uses dynamic typing,但是INTEGER PRIMARY KEY is special。)

导入临时表,然后将数据复制到真实表,同时将数字转换为实际数字:

CREATE TABLE nodes_temp(...);
.import nodes.csv nodes_temp

CREATE TABLE nodes(...);
INSERT INTO nodes
SELECT CAST(id AS INTEGER), CAST(lat AS REAL), ...
FROM nodes_temp;

答案 1 :(得分:0)

因为我使用python pandas提供了一种更简单的方法 - 归功于Tennessee Leeuwenburg

c_nodes = "CREATE TABLE nodes(id INTEGER PRIMARY KEY NOT NULL, lat REAL, lon REAL, user TEXT, uid INTEGER, \
version INTEGER, changeset INTEGER, timestamp TEXT);"

conn = sqlite3.connect('osm.db')
cursor = conn.cursor()

cursor.execute(c_nodes)
df_nodes = pd.read_csv('nodes.csv')
df_nodes.to_sql('nodes',conn, if_exists='append', index=False)