python基本命令复制_python-psycopg2中的COPY命令

我有一个过程正在从4个数据库中读取,每个数据库有4个表.我正在将该数据合并到总共4个表的1个postgres数据库中. (原始的4个数据库中的每一个都有相同的4个表,需要合并).

我现在的做法是使用熊猫.我一次从所有4个数据库中读取一张表,将数据连接到一个数据帧中,然后使用to_sql将其保存到我的postgres数据库中.然后,我遍历到其余数据库,对其他表执行相同的操作.

我的问题是速度.我的一张表每个日期有大约1-2百万行,因此完成将数据写入postgres可能需要5,000到6,000秒.将其写入.csv文件,然后在pgadmin中使用COPY FROM更快.

这是我当前的代码.请注意,有一些函数调用,但它基本上只是引用表名.我还完成了一些基本的日志记录,但这不是必须的.我正在为源数据库添加一列,但这是必需的.我正在从实际上是字符串的字段中删除.0,但是pandas也将它们视为浮点型,并且我用0填充空白整数,并确保列的类型确实是int.

def query_database(table, table_name, query_date):

df_list = []

log_list = []

for db in ['NJ', 'NJ2', 'LA', 'NA']:

start_time = time.clock()

query_timestamp = dt.datetime.now(pytz.timezone('UTC')).strftime('%Y-%m-%d %H:%M:%S')

engine_name = '{}{}{}{}'.format(connection_type, server_name, '/', db)

print('Accessing {} from {}'.format((select_database(db)[0][table]), engine_name))

engine = create_engine(engine_name)

df = pd.read_sql_query(query.format(select_database(db)[0][table]), engine, params={query_date})

query_end = time.clock() - start_time

df['source_database'] = db

df['insert_date_utc'] = query_timestamp

df['row_count'] = df.shape[0]

df['column_count'] = df.shape[1]

df['query_time'] = round(query_end, 0)

df['maximum_id'] = df['Id'].max()

df['minimum_id'] = df['Id'].min()

df['source_table'] = table_dict.get(table)

log = df[['insert_date_utc', 'row_date', 'source_database', 'source_table', 'row_count', 'column_count', 'query_time', 'maximum_id', 'minimum_id']].copy()

df.drop(['row_count', 'column_count', 'query_time', 'maximum_id', 'minimum_id', 'source_table'], inplace=True, axis=1)

df_list.append(df)

log_list.append(log)

log = pd.concat(log_list)

log.drop_duplicates(subset=['row_date', 'source_database', 'source_table'], inplace=True, keep='last')

result = pd.concat(df_list)

result.drop_duplicates('Id', inplace=True)

cols = [i.strip() for i in (create_columns(select_database(db)[0][table]))]

result = result[cols]

print('Creating string columns for {}'.format(table_name))

for col in modify_str_cols(select_database(db)[0][table]):

create_string(result, col)

print('Creating integer columns for {}'.format(table_name))

for col in modify_int_cols(select_database(db)[0][table]):

create_int(result, col)

log.to_sql('raw_query_log', cms_dtypes.pg_engine, index=False, if_exists='append', dtype=cms_dtypes.log_dtypes)

print('Inserting {} data into PostgreSQL'.format(table_name))

result.to_sql(create_table(select_database(db)[0][table]), cms_dtypes.pg_engine, index=False, if_exists='append', chunksize=50000, dtype=create_dtypes(select_database(db)[0][table]))

如何在此插入COPY TO和COPY FROM以加快速度?我应该只编写.csv文件然后在这些文件上循环还是可以从内存复制到我的postgres?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值