【发布时间】:2018-08-15 17:27:24
【问题描述】:
我正在使用 SQLite 中的数据库,并将一堆 csv 文件导入我的数据库。不幸的是,据我所知,在导入期间无法添加主键,因此我正在使用一种变通方法,在其中读取 csv 文件并使用 Pandas 的to_sql,然后使用executescript:
df = pd.read_csv('filepath.csv', header = 0, index_col = False, encoding = 'UTF-8')
df.to_sql(name = 'table1', con = conn, if_exists='replace', index=False)
c.executescript('''
PRAGMA foreign_keys=off;
BEGIN TRANSACTION;
ALTER TABLE table1 RENAME TO table1_alt;
/*create a new table with the same column names and types while
defining a primary key for the desired column*/
CREATE TABLE Ass_info_table (column1 INT,
column2 TEXT,
column3 INT,
column4 INT,
column5 INT,
column6 TEXT,
column7 TEXT,
column8 TEXT,
column9 TEXT,
column10 TEXT,
column11 TEXT,
column12 INT,
column13 INT,
ID INT PRIMARY KEY NOT NULL);
INSERT INTO table1 SELECT * FROM table1_alt;
DROP TABLE table1_alt;
COMMIT TRANSACTION;
PRAGMA foreign_keys=on;''')
这很好用,但我有一堆 csv 文件,我想通过 glob 将它们全部导入循环中。我的问题是,为了做到这一点,我需要想办法将表和列的名称放入函数中的 SQL 脚本中。该功能可以在表导入数据库时使用,也可以在导入数据库后使用,这并不重要。
任何人有任何建议,都非常欢迎!
【问题讨论】:
-
为什么不使用 SQLite 命令行将 CSV 导入当前具有整数主键的空表,因为每个 SQLite 常见问题解答:A column declared INTEGER PRIMARY KEY will autoincrement?
-
你是单独使用pd.to_sql和脚本吗?
-
mad_ 我单独使用它们,因为只需将 csv 导入数据库即可给我一个没有主键的表。 Parfait,如果我这样做,那么我有一个已经分配主键的表,对吗?这是我不想要的。
-
与任何数据库的自动增量(或序列,如果使用 Oracle 和 SQL Server 中的标识)一样,主键将随每个新记录自动增量。没有提前分配任何内容。
-
不幸的是,csv 文件已经有一个内置的唯一 ID,我需要将其用作主键(用于关系目的),所以我必须使用已经存在的内容并将主键分配给一个现有列。
标签: python sql database pandas sqlite