【问题标题】:How can I import a csv file without primary key to sqlite3如何将没有主键的 csv 文件导入到 sqlite3
【发布时间】:2018-05-22 22:38:17
【问题描述】:

我想用存储在 csv 文件中的初始数据填充一个新的数据库。 我尝试使用 odo 用 csv 文件的内容填充现有表。我的文件没有主键,并且列数不匹配,因为数据库定义了其他列。

如何使用 odo 来实现这一点?

from sqlalchemy import Column, String, Integer, create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = 'testtable'

    uid = Column(Integer, primary_key=True)
    colA = Column(String(50))
    colB = Column(String(50))
    comment = Column(String(100))

engine = create_engine('sqlite:///testdb.db')
Base.metadata.create_all(engine)

我的 csv 文件如下所示:

col A;col B
aa;bb
ax;bx

这不起作用:

from odo import odo
odo('csvfile.csv', 
    'sqlite:///testdb.db::testtable', 
    has_header=True)

错误信息:

expected 4 columns but found 3 - filling the rest with NULL
INSERT failed: datatype mismatch

【问题讨论】:

  • 不工作怎么办?你有错误吗?如果是这样,请将它们包括在问题中。
  • 我添加了相关的错误信息。如果我在数据库中有正确数量的列和具有匹配列标题的 csv 文件,则同样有效。
  • 不是一个解决方案,但请注意,在 SQLite 的情况下,odo 不会将 SQLAlchemy 用于实际的 CSV 到 SQL 导入:github.com/blaze/odo/blob/master/odo/backends/sql_csv.py#L63。该错误是.import csvfile.csv testtable 命令失败的结果。

标签: python sqlite csv sqlalchemy odo


【解决方案1】:

查看您的初始表 - 您的 csv 仅包含两列,并且正在生成第三列(可能是主键)。检查是否不需要注释(或使用一些默认文本,如下例所示),然后将每个值显式放入数据库列中,或考虑在初始填充期间删除该列,并在初始填充后重新创建。

这是一个将每个值显式放置在相应列中的示例。这解决了 sqlite3 未将提供的输入数量与可用列对齐的问题:

import csv
# just my flavor...    

with open('csvfile.csv', 'r') as csvfile:
    # Next three lines detect dialect
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    # csvfile.seek(1,0) skips the first line of the file containing headers
    csvfile.seek(1,0)
    reader = csv.reader(csvfile, dialect)

for line in reader:
    A = line[0]
    B = line[1]
    rec = Test(colA=A, colB=B,comment='default text')
    session.add(rec)
    session.commit()

为了完全避免这个问题,在填充数据库之前不要使用 cmets:

class Test(Base):
    __tablename__ = 'testtable'
    uid = Column(Integer, primary_key=True)
    colA = Column(String(50))
    colB = Column(String(50))

这应该允许使用您的 odo 作为填充数据库的一种方式。

【讨论】:

    猜你喜欢
    • 2015-02-06
    • 2016-12-03
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多