CSV每天都会上传到同一个表格中

时间:2018-04-17 12:59:28

标签: python pandas sqlalchemy teradata

我需要每天将csv文件上传到teradata数据库。 我每天早上都收到这个文件到ftp服务器,我想拉取数据并上传到teradata, 到目前为止,我已经设法从ftp中提取数据,保存它,添加日期列并用虚拟填充空值。

create_engine('teradata://'+ user +':' + pasw + '@'+ host +'/' + '?authentication=LDAP')

诀窍,但它也让我感到悲痛,使用另一种方法。(无论如何)

现在我到了必须将数据上传到现有表的部分。我设法建立连接:

user_dev

这连接到主数据库,但该表位于子数据库中(不确定这是否为单词)让我们调用它test。让我们调用表td_engine = create_engine('teradata://'+ user +':' + pasw + '@'+ host +'/' + '?authentication=LDAP') print (td_engine) connection = td_engine.raw_connection() print ('logged in to teradata') def Load_Data(file_name): data = genfromtxt(file_name, delimiter=',', skip_header=1, converters={0: lambda s: str(s)}) return data.tolist() Base = declarative_base() class pb_test(Base): __Tablename__= "test" entry_date = Column(Date) WID = Column(VARCHAR(50),primary_key=True) User_IP_co = Column(VARCHAR(50)) User_S = Column(VARCHAR(50)) Visitors = Column(Integer) Reg = Column(Integer) Real = Column(Integer) Regi = Column(Integer) First = Column(Integer) First_D = Column(Integer) def __repr__(self): return "(entry_date='%s', WID='%s', User_IP_co='%s', User_S='%s', Visitors='%s', Reg='%s', Real='%s', Regi='%s', First='%s', First_D='%s')" % (self.entry_date, self.WID, self.User_IP_Co, self.User_S, self.Visitors, self.Reg, self.Real, self.Regi, self.First, self.First_D) yesterday = date.today() - timedelta(1) FileToRead = pd.read_csv('Report20'+str(yesterday.strftime('%y%m%d'))+'.csv') tableToWriteTo = 'USER_DEVELOPMENT.test' #data.head() df = pd.DataFrame(FileToRead) listToWrite = df.to_dict(orient='records') metadata = sqlalchemy.schema.MetaData(bind=td_engine,reflect=True) table = sqlalchemy.Table(tableToWriteTo, metadata, autoload=True) Session = sessionmaker(bind=td_engine) session = Session() connection.execute(table.insert(), listToWrite) session.commit() session.close()

我每天都有一个包含10个colums和大约4000行的csv。 还有一些空值(不在主键中)。

现在我不太确定声明基础和其余部分,我试图使用它们但是我失败了。

sqlalchemy.exc.InvalidRequestError: Class <class '__main__.test'> does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.

不确定出现了什么问题,但我收到此错误消息:

pd.DataFrame({'a': range(20)})

>>  
    a
0   0
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  10
11  11
12  12
13  13
14  14
15  15
16  16
17  17
18  18
19  19

1 个答案:

答案 0 :(得分:0)

在我看来,你的方法有点混乱。您定义了一个声明性基础,然后无法使用它。如果你想走那条路,那就看看link。 (并且,如评论所述,您想要的参数是 tablename 。此外,您可能需要使用 table_args 来指定架构。)

或者,您可以在尝试底部时定义表及其列。有关此方法的详细信息,请参阅此link

鉴于您的任务简单,我可能会选择#2选项。

#table = sqlalchemy.Table(tableToWriteTo, metadata, autoload=True)
table = Table(
    'test',
    metadata,
    Column('WID', VARCHAR(50),primary_key=True),
    Column('entry_date', Date),
    Column('User_IP_co', VARCHAR(50)),
    Column('User_S', VARCHAR(50)),
    ...,
    schema='USER_DEVELOPMENT'
)