我目前正在处理一个我认为非常大的文件,需要将其放入postgreSQL数据库。下面是COPY命令用于插入数据库的.csv读取的几个示例行。行的结构是sample\u id和otu\u id是两个外键,它们引用sample表和otu表中的主键。你知道吗
sample_id,otu_id,count
163,2901,0.0
164,2901,0.0
165,2901,0.0
使用SQLAlchemy将以下代码摄取到表中:
self._engine.execute(
text('''COPY otu.sample_otu from :csv CSV header''').execution_options(autocommit=True),
csv=fname)
从.csv文件复制到表中后,我查询数据库中显示的示例,它会给出示例\u id=163,otu \u id=2901的结果,但不会给出其后的行。如果我是正确的,COPY命令会在遇到第一个错误后停止复制,所以我猜id 164和otu id 2901的样本有问题。你知道吗
我试过以下方法:
对于2901,otu表中有一个有效条目,对于 示例表ID164,所以我不认为这是一个缺少键的错误。
我还搜索了文件中重复的外键组合,但似乎找不到。
我试着只在复制的.csv文件中写入每一秒的条目,以防它与.csv文件的大小有关,但它最终给了我相同的问题,但在不同的点被切断。当只复制具有偶数otu id的条目时,otu id>;2890的后续表查询结果在sample id 152、otu id 2900处中断。
我尝试使用psql的\copy命令从.csv文件手动复制:
\copy sample_otu FROM 'bpaotu-ijpgihw6' WITH DELIMITER ',' CSV HEADER;
这似乎很管用。查询显示otu id超过otu id 2901。你知道吗
我只是很困惑为什么它会在那里中断,因为之前和之后的.csv行看起来是相同的,并且在它使用的外部表中有作为相应主键值的条目。你知道吗
对于任何遇到这种情况的人:
问题是一个简单的范围错误。我在python数据库导入脚本中丢失了一个使用block的文件缩进,因此它试图在完成文件编写之前从.csv文件复制。因此copy语句不会抛出错误,因为它假定文件在实际仍在写入时已完成。你知道吗
我移动了缩进,以便在文件写入块关闭后运行副本,现在可以工作了。你知道吗
它还解释了为什么psql\copy命令可以工作,而脚本副本不能像手动副本那样在文件已经创建但无法完全导入之后工作。你知道吗
相关问题 更多 >
编程相关推荐