Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 雪花:SQL编译错误:错误行标识符无效'&引用;日期UTC“';_Python_Sqlalchemy_Snowflake Cloud Data Platform - Fatal编程技术网

Python 雪花:SQL编译错误:错误行标识符无效'&引用;日期UTC“';

Python 雪花:SQL编译错误:错误行标识符无效'&引用;日期UTC“';,python,sqlalchemy,snowflake-cloud-data-platform,Python,Sqlalchemy,Snowflake Cloud Data Platform,我正在将数据从Postgres移动到snowflake。最初它是有效的,但我添加了: df_postgres["dateutc"]= pd.to_datetime(df_postgres["dateutc"]) 因为日期格式错误地加载到snowflake,现在我看到了以下错误: SQL编译错误:位置87处的错误行1无效标识符 “日期UTC” 这是我的密码: from sqlalchemy import create_engine import panda

我正在将数据从Postgres移动到snowflake。最初它是有效的,但我添加了:

df_postgres["dateutc"]= pd.to_datetime(df_postgres["dateutc"])
因为日期格式错误地加载到snowflake,现在我看到了以下错误:

SQL编译错误:位置87处的错误行1无效标识符 “日期UTC”

这是我的密码:

from sqlalchemy import create_engine
import pandas as pd
import glob
import os
from config import postgres_user, postgres_pass, host,port, postgres_db, snow_user, snow_pass,snow_account,snow_warehouse   
from snowflake.connector.pandas_tools import pd_writer
from snowflake.sqlalchemy import URL


from sqlalchemy.dialects import registry
registry.register('snowflake', 'snowflake.sqlalchemy', 'dialect')

    
engine = create_engine(f'postgresql://{postgres_user}:{postgres_pass}@{host}:{port}/{postgres_db}')


conn = engine.connect()

#reads query
df_postgres = pd.read_sql("SELECT * FROM rok.my_table", conn)

#dropping these columns
drop_cols=['RPM', 'RPT']
df_postgres.drop(drop_cols, inplace=True, axis=1)

#changed columns to lowercase
df_postgres.columns = df_postgres.columns.str.lower()


df_postgres["dateutc"]= pd.to_datetime(df_postgres["dateutc"])


print(df_postgres.dateutc.dtype)

sf_conn = create_engine(URL(
    account = snow_account,
    user = snow_user,
    password = snow_pass,
    database = 'test',
    schema = 'my_schema',
    warehouse = 'test',
    role = 'test',
))



df_postgres.to_sql(name='my_table',
                 index = False,  
                 con = sf_conn,
                 if_exists = 'append', 
                 chunksize = 300,
                 method = pd_writer)

为了完整性,将Ilja的回答从评论转移到回答:

  • 雪花是区分大小写的
  • 在编写“unquoted”SQL时,Snowflake会将表名和字段转换为大写
  • 这通常是有效的,直到有人决定开始在SQL中引用他们的标识符
  • pd\u writer
    在标识符中添加引号
  • 因此,当您使用
    df_postgres[“dateutc”]
    时,当其转换为完全引用的查询时,它将保持小写
  • 用Python编写
    df_postgres[“DATEUTC”]
    应该可以解决这个问题

我可以肯定,您的表在某种程度上是使用常规标识符创建的,即不带引号。Snowflake将它们存储在大写的情况下:。现在由于某种原因,
pd\u writer
被指示引用标识符(带分隔符),因此无法找到
“dateutc”
。该列或表实际上没有该列,并且由于您使用了
'append'
,因此失败。尝试将其命名为
DATEUTC
,看看会发生什么。@IljaEverilä感谢您的回复,我看到您提到了pdäU writer,我删除了它,它成功了!顺便说一句,Pandas实际上是在首先使用常规标识符创建表,因为列名都是小写,然后
pd\u writer
执行它应该执行的操作,即使用分隔标识符?我看到类似的问题也出现了。