postgresql 不同数据库不同模式下的数据迁移
编写不容易,转载请注明出处谢谢,
数据迁移
因为之前爬虫的时候,一部分数据并没有上传到服务器,在本地。本来用的就是postgresql,也没用多久,数据迁移的时候,也遇到了很多问题,第一次使pg_dump xx > filename
进行数据备份迁移的时候,发现恢复后的数据,和原来的数据库,模式一样,后来这种方法就被我舍弃了。
后来想到把原来的数据库中数据使用pandas导出来,再次存入新的数据库中,可能有一点麻烦,但是我觉得这种方法挺好用的。下边就介绍这种方法。
获取需要迁移数据库中模式下的所有表名
import pandas as pd
import psycopg2
# 连接数据库
conn = psycopg2.connect(database='58TC',
user='postgres',
password='123456',
host='127.0.0.1',
port=5432)
# 获取模式下的所有表的名字
tables = pd.read_sql_query("select * from pg_tables where schemaname='2019_3_11'",con=conn)
tables.head()
当前模式下的所有表
table_list = tables['tablename']
DataFrame中的数据写入postgresql
此处我借鉴的网上的一种方法,原文是哪里,我已经忘记了,感谢他的分享,下次找到再补上去。因为单独使用df.to_sql
速度太慢了,我的数据想还挺大的,使用sqlalchemy和copy语句能大幅度提到写入效率。
# df 写入数据库
import io
import pandas as pd
from sqlalchemy import create_engine
def write_to_table(df, table_name, if_exists='fail'):
db_engine = create_engine('postgresql://postgres:xxxxxx@XXXXX/***')# 初始化引擎
# db_engine = create_engine('postgresql://user:password@host/database')# 初始化引擎
string_data_io = io.StringIO() # 内存缓冲粗进行读写操作
df.to_csv(string_data_io, sep='|', index=False)
pd_sql_engine = pd.io.sql.pandasSQL_builder(db_engine)
table = pd.io.sql.SQLTable(table_name, pd_sql_engine, frame=df,
index=False, if_exists=if_exists,
schema = '2019-3-11-particulars')
table.create()
string_data_io.seek(0)
string_data_io.readline() # remove header
# 连接数据库
with db_engine.connect() as connection:
with connection.connection.cursor() as cursor: # 游标
copy_cmd = '''COPY "2019-3-11-particulars"."%s" FROM STDIN HEADER DELIMITER '|' CSV''' %table_name
# copy语句, 2019-3-11-particulars新数据库中的模式名
print(copy_cmd)
cursor.copy_expert(copy_cmd, string_data_io) # 执行语句
connection.connection.commit()
pd.io.sql.pandasSQL_builder()
PandasSQL子类
pd.io.sql.SQLTable()
用于将panda表映射到SQL表参数说明:
table_name
表名,pd_sql_engine
sql引擎,frame
df,index
,索引if_exists
,添加方式参数有
append表存在追加, fail,表存在跳过, replace,表存在删除重建schema
模式名
到此为止,基本工作完成,最后就是调用函数,执行迁移
for city_table in city_list:
# 需要迁移的城市列表
df = pd.read_sql_query('select * from "2019_3_12"."%s"' % city_table, con=conn)
try:
write_to_table(df,city_table)
except Exception as e:
print('c城市:',city_table,'错误',e)
print(city_table,'导入完成')
原文链接: https://www.cnblogs.com/liqk/p/10682274.html
转载请说明出处.
postgresql 不同数据库不同模式下的数据迁移的更多相关文章
- EntityFramework Code First 模式下使用数据迁移
启用数据迁移 在程序包管理控制台选择安装了EntityFramework的项目,键入如下指令以启EF用数迁移. Enable-Migrations 命令成功运行后,所选项目下会添加名为Migratio ...
- Oracle非归档模式下脱机数据文件
正常情况下,要想对数据文件脱机,必须在归档模式下,这是ORACLE自动保护的一种措施,防止在非归档模式下对数据文件脱机,造成数据丢失.如果想在非归档模式下执行数据文件脱机操作,则需要加上“for dr ...
- AXI总线slave模式下接收数据---verilog代码
AXI总线slave模式下接收数据---verilog代码 `timescale 1ns / 1ps ///////////////////////////////////////////////// ...
- Angularjs在360兼容模式下取数据缓存问题解决办法
测试提了一个bug,在360浏览器兼容模式下,删除页面数据需要手动刷新浏览器才能看到最新的数据.首先要复现当时的问题,很容易就复现了,但是发现在360浏览器兼容模式下无法打开开发者工具.好在经过反复重 ...
- 安卓开发笔记(十三):SQLite数据库储存(下)数据的增添,更改,删除,查询
SQLite数据库存储(下) 1.增添数据 对于添加数据的话我们只需要在主活动当中import新的包以及在主活动当中写上适当的代码就可以了,不需要在我们之前创建新的类当中书写新的代码.现在的主活动 ...
- 【 PostgreSQL】查询某模式下所有表的分布键信息
想看下某模式下所有表创建的分布键是否合理,查找系统表文档拼出如下sql,亲们如果有更好的sql或者意见欢迎留言! SELECT aaa.nspname AS "模式名", ...
- centos下mysql数据迁移方法
第一种: 原始数据库不需要重新安装: 默认mysql会安装在/var/lib/mysql这里,若将数据迁移到/data/mysql目录下,步骤如下: 1.停止mysql服务 2.#cp /var/li ...
- MVC模式下的数据展示:EasyUI的datagrid
我的数据库设计是一张老师表teacher,一张学生表student,一个教师对应多个学生,在学生一方建立外键; 还有一点想清楚,需要展示的数据是根据什么来的,是成功登陆的用户的id?还是直接展示所有的 ...
- centos下Elasticsearch数据迁移与备份
########### ### 共享创建es官方网站就一句话 ######## 1.下载 文件共享 .. rpm -i http://mirror.symnds.com/distributions ...
随机推荐
- decision tree 决策树(一)
一 决策树 原理:分类决策树模型是一种描述对实例进行分类的树形结构.决策树由结点(node)和有向边(directed edge)组成.结点有两种类型:内部结点(internal node)和叶结点( ...
- bzoj 2259: [Oibh]新型计算机 最短路 建模
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...
- NodeJS学习笔记 进阶 (11)Nodejs 进阶:调试日志打印:debug模块
个人总结:读完这篇文章需要5分钟,讲解了debug模块的使用 摘选自网络 前言 在node程序开发中时,经常需要打印调试日志.用的比较多的是debug模块,比如express框架中就用到了.下文简单举 ...
- Linux服务器性能评估与优化
一.影响务器性能因素 影响企业生产环境Linux服务器性能的因素有很多,一般分为两大类,分别为操作系统层级和应用程序级别.如下为各级别影响性能的具体项及性能评估的标准: (1)操作系统级别 内存: C ...
- [转载][来自csdn]RTS和CTS是什么意思?
原文链接: http://blog.csdn.net/zmq5411/article/details/6280332 这篇文章看着挺好,明白易懂,顺手转过来 34RTS和CTS是什么意思? 解释一:R ...
- shell应用之批量添加用户实例
这里要实现功能介绍 读取一个用户列表文件 给列表中的用户添加随机密码需要包含大小写字符和数字 保存对应的用户和密码文件 这些用户属于同个用户组 1.列表文件 [root@mail ~]# cat li ...
- 公路通行税Ceoi99(BFS+图的直径)
公路通行税(Ceoi99) 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 在PALMIA国家内,有N个城市由公路相连(每条 ...
- 如何下载最新版的 Adobe Flash Player
如何下载最新版的 Adobe Flash Player 中国访客用代理访问下面的链接,否则会自动跳转到 https://www.flash.cn/ 当我们从 https://get.adobe.com ...
- 【android】getCacheDir()、getFilesDir()、getExternalFilesDir()、getExternalCacheDir()的作用
getCacheDir()方法用于获取/data/data/<application package>/cache目录 getFilesDir()方法用于获取/data/data/< ...
- hdoj--3123--GCC(技巧阶乘取余)
GCC Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Subm ...