表存在时无法复制到不存在的表中

Posted

技术标签:

【中文标题】表存在时无法复制到不存在的表中【英文标题】:Cannot COPY into nonexistent table when table exists 【发布时间】:2021-12-08 23:58:39 【问题描述】:

所以,我有一个在下面创建的表 nba_schedule。当我尝试从 s3 csv 文件复制数据以使用 COPY 插入到表中时,我收到此错误 InternalError_: Cannot COPY into nonexistent table newsletter_schedule

我认为这是因为这一切都发生在同一个事务中,这是我在这里应该做的。此外,redshift 变量位于一个 env 文件中,我不会共享加载该文件的代码。

redshift_table = 'nba_schedule'


# Connect to redshift
conn_string = "dbname= port= user= password= host=".format(
    redshift_dbname, redshift_port, redshift_user, redshift_password, redshift_host)
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()


logging.info("Creating newsletter_schedule table in Redshift")

sql = f"""DROP TABLE IF EXISTS schema + "." + redshift_table"""
cursor.execute(sql)
sql = f"""CREATE TABLE IF NOT EXISTS schema + "." + redshift_table (
             Date DATE,
             Player_Name VARCHAR(255),
             Player_Nickname VARCHAR(13),
             Player_No VARCHAR(13),
             Points VARCHAR(255),
             Rebounds VARCHAR(255),
             Assists VARCHAR(255),
             Blocks VARCHAR(1),
             3PM VARCHAR(1),
             3PA VARCHAR(1),
             FGM VARCHAR(50),
             FGA VARCHAR(255),
             three_percent VARCHAR(50),
             fg_percent VARCHAR(50)
             )
        """
cursor.execute(sql)
sql =f"""
        COPY newsletter_schedule
        FROM 's3://random_sample_data/nba_redshift/s3_file'
        CREDENTIALS 'aws_iam_role=arn:aws:iam::4254514352:role/SampleRole'
        DELIMITER ','
        IGNOREHEADER 1
        EMPTYASNULL
        QUOTE '"'
        CSV
        REGION 'us-east-1';

    """
cursor.execute(sql)
    
conn.commit()

有什么想法吗?

【问题讨论】:

【参考方案1】:

我的第一个想法是 CREATE TABLE 具有明确定义的架构,但没有定义架构的 COPY 命令,只是表名。现在我不知道您正在使用什么架构,也不知道该用户在 Redshift 上的搜索路径是什么,但您似乎应该检查一下这不仅仅是架构搜索路径问题。

如果在 COPY 命令中使用 schema.table 会发生什么? (这个调试路径比描述如何评估用户的搜索路径更容易解释)

还有其他更微妙的方式可能会发生这种情况,但我已经学会首先查看简单的原因 - 它们更容易排除,而且往往不是根本原因。

【讨论】:

就是这样。谢谢!

以上是关于表存在时无法复制到不存在的表中的主要内容,如果未能解决你的问题,请参考以下文章

如何获取另一个表中不存在的表的记录?

HQL 左外连接用于查找一个表中存在而其他表中不存在的记录

如何在 sqlldr 的输入文件中不存在的表中插入值?

有效地找到表中不存在的第一个数字?

mysql获取条件中描述的所有记录,即使表中不存在

从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录