批量加载包含日期的多个CSV文件到Oracle数据库日期
Batch loading multiple CSV files which include Date into Oracle database Date
我正在尝试将包含 YYYY-MM-DD 日期格式的 CSV 文件加载到 oracle 数据库。但是,总是以“DatabaseError: ORA-01861: literal does not match format string”结束。
我认为它需要一种 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
如有任何帮助,我们将不胜感激。
假设 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)
作为一般做法,我强烈建议列出您要向其中插入数据的列,以使您的代码自我记录,这样如果有人稍后将新列添加到 table。我在猜测您的 table 的列名,但类似于
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)
我正在尝试将包含 YYYY-MM-DD 日期格式的 CSV 文件加载到 oracle 数据库。但是,总是以“DatabaseError: ORA-01861: literal does not match format string”结束。
我认为它需要一种 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
如有任何帮助,我们将不胜感激。
假设 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)
作为一般做法,我强烈建议列出您要向其中插入数据的列,以使您的代码自我记录,这样如果有人稍后将新列添加到 table。我在猜测您的 table 的列名,但类似于
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)