python脚本:Teradata 转换成bigquery的DDL_bigquery create multiset table-程序员宅基地

技术标签: python  postgresql  数据库  

python脚本
用于Teradata 装换成bigquery的DDL
包含了varchar、char、bigint、date、decimal转换
例如:
TD:
CREATE MULTISET TABLE XXXX.AAA ,FALLBACK,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM=DEFAULT,
DEFAULT MERGEBLOCKRATO,
MAP=TD_MAP1
(
ID CHAR(5) CHARACTER SET LATIN CASESPCIFIC NOT NULL,
AMOUNT DECIMAL(23,3) COMPRESS 0.000,
NUM BIGINT NOT NULL,
DAY DATE FORMAT ‘yyyy-mm-dd’ NOT NULL,
NAME VARCHAR(250) CHARACTER SET LATIN CASESPECIFIC NOT NULL,
FLAG CHAR(1) CHARACTER SET LATIN CASESPECIFIC NOT NULL DEFAULT ‘Y’
)
PRIMARY INDEX(‘ID’);

BQ:
CREATE OR REPLACE TABLE YYYY.AAA(
ID STRING NOT NULL,
AMOUNT NUMERIC,
NUM INT64 NOT NULL,
DAY DATE FORMAT 'yyyy-m
DAY DATE NOT NULL,
NAME NOT NULL,
FLAG NOT NULL
)
;


import paramiko
import re
import csv
import time
import numpy as np
import pandas as pd
import os

def sql_del(TD_DDL,data)
#schema_td为TD原数据库名,schema_bq为BQ数据库名
	schema_td='xxxx.'
	schema_bq='yyyy.'
	BQ_DDL=re.sub(r'(?ms),.*?\($',TD_DDL).replace('MULTISET','OR REPLACE').replace(schema_td,schema_bq)

	index=re.findall(r'(?ms)PRIMARY INDEX.*?;$'|UNIQUE PRIMARY INDEX.*?;$',BQ_DDL)
	
	BQ_DDL=re.sub(r'(?ms)PRIMARY INDEX.*?;$'|UNIQUE PRIMARY INDEX.*?;$',';',BQ_DDL)
	
	table=re.findall(r'(?ms)XXXX\..*?\($',BQ_DDL)
	table_name=str(table).replace('(','').replace('[','').replace(']','').replace('\'','')
	
	if len(index)!=0:
		mark={
    }
		mark['table_name']=table_name
		mark['default']='PRI'
		mark['index']=str(index).replace('[','').replace(']','').replace('\'','')
		data.append(mark)
	
	#处理VARCHAR和CHAR类型
	com=re.findall(r'(?ms)VARCHAR.*?\,$|CHAR.*?\,$|VARCHAR.*?\)$|CHAR.*?\)$',BQ_DDL)
	
	for in in com:
		mark={
    }
		if i.find('DEFAULT')!=-1:
			mark['table_name']=table_name
			mark['default']=i
			mark['index']=str(index).replace('[','').replace(']','').replace('\'','')
			data.append(mark)
		if i[-1]==')':
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'STRING NOT NULL)')
			else:
				BQ_DDL=BQ_DDL.replace(i,'STRING)')
		else:
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'STRING NOT NULL,')
			else:
				BQ_DDL=BQ_DDL.replace(i,'STRING,')	
			
	#处理BIGINT类型
	com=re.findall(r'(?ms)BIGINT.*?\,$|BIGINT.*?\)$',BQ_DDL)
	
	for in in com:
		mark={
    }
		if i.find('DEFAULT')!=-1:
			mark['table_name']=table_name
			mark['default']=i
			mark['index']=str(index).replace('[','').replace(']','').replace('\'','')
			data.append(mark)
		if i[-1]==')':
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'INT64 NOT NULL)')
			else:
				BQ_DDL=BQ_DDL.replace(i,'INT64 )')
		else:
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'INT64 NOT NULL,')
			else:
				BQ_DDL=BQ_DDL.replace(i,'INT64 ,')	
	#处理DECIMAL类型
	com=re.findall(r'(?ms)DECIMAL.*?\,$|DECIMAL.*?\)$',BQ_DDL)
	
	for in in com:
		mark={
    }
		if i.find('DEFAULT')!=-1:
			mark['table_name']=table_name
			mark['default']=i
			mark['index']=str(index).replace('[','').replace(']','').replace('\'','')
			data.append(mark)
		if i[-1]==')':
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'NUMERIC NOT NULL)')
			else:
				BQ_DDL=BQ_DDL.replace(i,'NUMERIC )')
		else:
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'NUMERIC NOT NULL,')
			else:
				BQ_DDL=BQ_DDL.replace(i,'NUMERIC ,')	
	#处理DATE类型
	com=re.findall(r'(?ms)DATE.*?\,$|DATE.*?\)$',BQ_DDL)
	
	for in in com:
		mark={
    }
		if i.find('DEFAULT')!=-1:
			mark['table_name']=table_name
			mark['default']=i
			mark['index']=str(index).replace('[','').replace(']','').replace('\'','')
			data.append(mark)
		if i[-1]==')':
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'DATE NOT NULL)')
			else:
				BQ_DDL=BQ_DDL.replace(i,'DATE)')
		else:
			if i.find('NOT NULL')!=-1:
				BQ_DDL=BQ_DDL.replace(i,'DATE NOT NULL,')
			else:
				BQ_DDL=BQ_DDL.replace(i,'DATE,')

	return BQ_DDL,table_name,data



#############main################
o=os.walk(r'要更换的TD文件的路径')
data=[]
#循环读取Windows制定目录下文件,并根据sql_del处理写入到存放路径
for path,dir_list,file_name in o:
	 for i in file_name:
	 	reader=open(path+i,'r')
	 	TD_DDL=reader.read()
	 	BQ_DDL,table_name,data=sql_del(TD_DDL,data)
	 	reader.close()
		
		fo=open(r'生成BQ的DDL文件的存放路径')
		fo.write(BQ_DDL)
		fo.close()
		default_mark=pd.DataFrame(data,columns=['table_name','default','index'])
#记录TD中原有的table对应的default默认值和index`在这里插入代码片`
default_mark.to_csv(r'把没有转换的default和index记录在csv文件中,这里为csv文件保存路径',index=False)	

以上代码类型转换部分还可以优化,暂时先记录这些,后期再做优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44560292/article/details/120380138

智能推荐

MAVEN学习笔记-解决Spring cloud中项目间有依赖关系导致打包报错问题_idea 打包springcloud时 单个项目打包出现依赖问题-程序员宅基地

文章浏览阅读4.1k次。项目Module之间有依赖关系时会导致打jar包失败。比如,athena-eureka、athena-keystone等模块会在pom中依赖athena-common<dependency> <artifactId>athena-common</artifactId> <groupId>com.xxx.xxx</groupId&..._idea 打包springcloud时 单个项目打包出现依赖问题

C++ 动态库&静态库创建和使用_c++ 动态库 静态库创建-程序员宅基地

文章浏览阅读1.3k次。什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:静态库之所以成为【静_c++ 动态库 静态库创建

页表项中各个位的作用_存在位是用于-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏22次。问题:在请求分页系统中,页表中的辅存始地址是供(D)参考的。 A.页面置换 B.内存分配 C.页面换出 D.页面调入页表项有:|页号|物理块号|状态位P|访问字段A|修改位M|外存地址|各个位的作用:1)状态位P:用于指示该页是否已调入内存,供程序访问时参考; 2)访问字段A:用于记录本页在一段时间内被访问次数,供选择换出页面时参考; 3)修改位M:表示该页在调..._存在位是用于

typedef关键字_typedef unsigned char u8;-程序员宅基地

文章浏览阅读2.6k次,点赞7次,收藏26次。typedef是C语言的一个关键字,我们实际使用的时候可以理解成是一个绑定器,把若干标识符绑定在一起形成一个新类型,它是给编译器看的,编译器看到这个就直接将其当做一个新的类型看待了。当然了,如果有些人写的编译器并不是这么看待的,那就只能说明他对于C语言标准还没有彻底整明白。1. typedef unsigned char u8; //u8就代表unsigned char类..._typedef unsigned char u8;

区块链+保险的概述和发展现状_区块链保险概述-程序员宅基地

文章浏览阅读2.2k次。文章来源: http://www.blockchainbrother.com/在国外,区块链保险联盟B3i成立于2016年10月,联盟成员包含了美国再保险集团、Liberty Mutual保险公司、汉诺威保险公司、SCOR、杰勒拉利保险集团、瑞士苏黎世保险集团、瑞士再保险集团、慕尼黑保险集团、安联保险集团等等。这一平台将全球最大的保险集团连接到链上,力图使用已经成熟的区块链智能合约技术,提..._区块链保险概述

官方文档翻译-ESP32-Heap Memory Allocation_malloc_cap_dma-程序员宅基地

文章浏览阅读2.2k次。堆内存分配概述The ESP32 has multiple types of RAM. Internally, there’s IRAM, DRAM as well as RAM that can be used as both. It’s also possible to connect external SPI RAM to the ESP32 - external RAM can..._malloc_cap_dma

随便推点

Web自动化测试Selenium(1)选择元素基本方法-2021-10-07_选择网页相应元素-程序员宅基地

文章浏览阅读535次,点赞5次,收藏9次。1. selenium环境安装Selenium环境的安装主要就是安装两样东西: 客户端库 和 浏览器 驱动 。selenium安装 pip install selenium浏览器安装 首选谷歌浏览器驱动安装 驱动版本要和浏览器版本对应2. 基本使用2.1 启动浏览器并搜索网站2.2 定位元素定位元素进行搜索F12 进入开发者模式,找到Elements选择页面元素,鼠标右击检查,找对对应语句,然后根据特征进行查找下面所有定位元素的方法,返回的对象都是·WebElement对_选择网页相应元素

php漏洞全解_<?php if(isset($_get['c'])){ $arg=$_get['c']; syst-程序员宅基地

文章浏览阅读7.9w次。1、命令注入(CommandInjection)2、eval注入(EvalInjection)3、客户端脚本攻击(ScriptInsertion)4、跨网站脚本攻击(CrossSiteScripting,XSS)5、SQL注入攻击(SQLinjection)6、跨网站请求伪造攻击(CrossSiteRequestForgeries,CSRF)7、Session会话劫持(SessionHijacking)......_<?php if(isset($_get['c'])){ $arg=$_get['c']; system($arg.">/dev/null 2>&1ka</div>

BearPi_HM Nano开发板环境搭建踩坑_bearpi-hm_nano penharmony的源码不在src目录下-程序员宅基地

文章浏览阅读4.3k次,点赞7次,收藏23次。Bear_Pi Nano开发板环境搭建踩坑出现的的指令建议直接复制使用请保证网络状态良好保持心态良好我本次开发选择的是本地的实体机加上虚拟机,都是在本地环境,没有使用云服务器部署如果使用云服务器的话,服务器可能已经配置好了相关的一些云服务,直接按照官方给的操作步骤一步一步操作就行但是可能会涉及到端口的问题,如果遇到相关的问题,可以看我的往期的文章,有说明如何开启一、换源–更换源的配置1、npm换源nodejs有一个中文网Nodejs中文网,是一个镜像网站,在这里面下载速度就比较快先_bearpi-hm_nano penharmony的源码不在src目录下

网页文件是用html语言创建的文本文件,把txt文件变成html网页文件-程序员宅基地

文章浏览阅读1.6k次。如果您看过《HTML是什么?——零基础自学网页制作》这篇教程,请按照其中说明创建一个txt文件。具体过程如下:step1:在您方便的磁盘中建立一个文件夹,命名为"零基础自学网页制作"。例如我在D盘中建立了"零基础自学网页制作"文件夹。step2:在文件夹中创建"HTML框架.txt"文件。鼠标移动到空白处点击右键选择"文本文档"。命名为"html框架",如下图所示。如果您的电脑没有显示".txt"..._网页用txt修改后如何再变成网页文件

iTest--记录android app消耗的cpu/内存/流量 /电量_itest app性能监控cpu怎么看-程序员宅基地

文章浏览阅读8.1k次,点赞2次,收藏13次。iTest-是gt外的另一款记录android app消耗的cpu/内存/流量 /电量的工具,1.下载并安装到手机2.打开itest并注册(有些功能需要注册才能使用),点击监控应用的增加按钮,选择要测试的应用。点击监控指标选择要监控的指标3.点击启动监控,然后操作该应用即可。4.测试完成后,回到itest界面,点击停止监控,自动保存监控的数据。5.点击主_itest app性能监控cpu怎么看

Java.util.List_小白学JAVA_java.until.list是-程序员宅基地

文章浏览阅读287次。List&lt;E&gt; :有序且允许重复的容器;//我一般直接把他称为线性表熟悉的实现类有AbstractList&lt;E&gt;//随机访问数据结构的父类(如数组,ArrayList就是它的实现类);AbstractSequentialList&lt;E&gt; extends AbstractList&lt;E&gt;//连续访问数据结构的父类(如链表,LinkedList就是它的实..._java.until.list是

推荐文章

热门文章

相关标签