【问题标题】:Batch loading multiple CSV files which include Date into Oracle database Date将多个包含日期的 CSV 文件批量加载到 Oracle 数据库日期中
【发布时间】:2021-07-05 06:18:54
【问题描述】:

我正在尝试将包含 YYYY-MM-DD 日期格式的 CSV 文件加载到 oracle 数据库。但是,总是以“数据库错误:ORA-01861:文字与格式字符串不匹配”结束。

我认为它需要一种 TO-DATE 类型,但不知道在批处理模式下实现它。

    # Locating CSVs
    
    DATA_FILES_PATH = 'apt-data-files'
    data_files = os.listdir(DATA_FILES_PATH)
    data_files = [ f'{DATA_FILES_PATH}/{r}' for r in data_files ]
    
    # dataframe to tuple list
    testD_tp = [ tuple(r) for r in testD.values ]
    
    # dataframe -> DB insert function
    
    def bulk_insert(tuple_data):
        bulk_insert_sql = """
            INSERT INTO APT_DEAL_PRICE
            VALUES (
                SEQ_ID.NEXTVAL, :REGION, :REGION_SUB, :APT_NAME,
                :APT_SIZE, :APT_FLOOR, :CONTRACT_DATE, :CONTRACT_PRICE,
                :COMPLETION_YEAR, :STREET_NUM, :STREET_NAME)
            """
    
        conn = cx_Oracle.connect('house', 'house', 'localhost:1521/xe')
        cursor = conn.cursor()
    
        cursor.prepare(bulk_insert_sql)
        cursor.executemany(None, tuple_data)
        
        conn.commit()
        cursor.close()
        conn.close()
        
        
    # Batching dataframe to DB
    
    bulk_insert(testD_tp)

它告诉我我有一个 DatabaseError

DatabaseError: ORA-01861: literal does not match format string

任何帮助将不胜感激。

【问题讨论】:

  • 附注:这个问题中没有特定于数组绑定(即批处理)的内容。使用execute() 插入单行也会出现同样的问题。

标签: python oracle csv batch-processing executemany


【解决方案1】:

假设 contract_date 是唯一的 date 列,您可能想要

INSERT INTO APT_DEAL_PRICE
        VALUES (
            SEQ_ID.NEXTVAL, :REGION, :REGION_SUB, :APT_NAME,
            :APT_SIZE, :APT_FLOOR, to_date(:CONTRACT_DATE, 'yyyy-mm-dd'),
            :CONTRACT_PRICE, :COMPLETION_YEAR, :STREET_NUM, :STREET_NAME)

作为一般做法,我强烈建议您列出您要插入数据的列,以使您的代码能够自我记录,这样如果以后有人向表中添加新列,您的代码就不会失败。我在猜测您的表格的列名,但类似于

INSERT INTO APT_DEAL_PRICE( apt_deal_price_id, region, region_sub, apt_name,
                            apt_size, apt_floor, contract_date,
                            contract_price, completion_year, street_num, street_name )
        VALUES (
            SEQ_ID.NEXTVAL, :REGION, :REGION_SUB, :APT_NAME,
            :APT_SIZE, :APT_FLOOR, to_date(:CONTRACT_DATE, 'yyyy-mm-dd'),
            :CONTRACT_PRICE, :COMPLETION_YEAR, :STREET_NUM, :STREET_NAME)

【讨论】:

  • 谢谢你,贾斯汀。这对我来说是一个完美的答案!谢谢你的建议!
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多