python - 使用 Python 和 FaSTLoad 实用程序将 csv 上传到 Teradata DB

标签 python teradata

我花了相当多的时间研究使用 Teradata FaSTLoad 上传 csv 文件的合理方法,但文档简短、有限且不清楚。

给定一个 csv,你如何将它上传到给定的数据库?

最佳答案

我创建了一个 Gist使用 Python 类,该类包含使用 pyodbc 与 Teradata 通信的所有必要方法。

特别是使用此方法上传 csv 文件时,您的 csv 文件必须满足特定条件:

  1. 使用竖线作为分隔符:'|'
  2. csv 中的所有值都必须用双引号引起来:“值”
  3. 避免在文件中使用列名

例子:

"value1" | "value2" | "value3"

"value1" | "value2" | "value3"

"value1" | "value2" | "value3"

这可以通过使用 pandas 来实现:

import pandas as pd
from csv import QUOTE_ALL
data.to_csv('tmp.csv', index=False, sep='|', quotechar='"', quoting=QUOTE_ALL, header=False)

在此之后,您可以使用此功能:

def upload_csv(database, csv_file, table, columns, user, password, verbose=True):
    """
    This function uses Fastlaod utily to upload csv file delimited with "|" instead of ',' and where all values in
    file are quoted. Ex: "value1" | "value2" | . . .
    :param csv_file: csv file without columns names
    :param table: Insertion table
    :param columns: Column names
    :param user: username
    :param password:
    :param verbose: True | False if output is required
    """

    script_text = fastload_template.substitute(DATA_FILE=csv_file,
                    COLUMN_DEFINITIONS=',\n'.join(['"' + column + '" (varchar(2000))' for column in columns]),
                    VALUES=',\n'.join([':' + '"' + column + '"' for column in columns]),
                    DATABASE=database, TABLE=table, USER=user, PASSWORD=password)

    tmp_file = csv_file[:-4]
    script = open(tmp_file, "w")
    script.writelines("%s\n" % script_text)
    script.close()

    try:
        if verbose:
            run(["fastload < " + tmp_file], check=True, shell=True)
        else:
            run(["fastload < " + tmp_file], check=True, shell=True, stdout=open(os.devnull, 'w'))

    except CalledProcessError as e:
        if e.args[0] != 8:  # Fastload gives error 8 but insert is working.. so don't touch :)
            raise e

    os.remove(tmp_file)

关于python - 使用 Python 和 FaSTLoad 实用程序将 csv 上传到 Teradata DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53499034/

相关文章:

python - SQLAlchemy 和 Falcon - session 初始化

python - 尝试通过 API 在销售订单行中添加服务产品时出现 "Record does not exist or has been deleted "错误

python - 使用 GOOGLE Analytics API - 指标/维度

mysql - 使用某些条件过滤时 SQL 给出错误结果

sql - 创建表但如果表已经存在则删除它

sql - SQL 和 SQL-MR 查询如何在 Teradata aster 内部工作?

python - 如何将单词 'and'添加到返回的字符串列表中

python - 如何从应用程序代码访问 Gunicorn 的配置参数?

r - 使用 RODBC sqlSave 将数据框从 R 写入 Teradata 中的表

indexing - 确定 Teradata 中表的主索引