【问题标题】:Download DML and DDL sql from Teradata using python使用 python 从 Teradata 下载 DML 和 DDL sql
【发布时间】:2022-01-16 17:30:42
【问题描述】:

我应该遵循什么方法来使用 python 从 teradata 数据库下载 DDL、DML 和存储过程。

我已经创建了示例代码,但是下载这些 sql 文件以进行数据迁移过程的方法是什么。

udaExec = teradata.UdaExec(appName="HelloWorld", version="1.0",logConsole=False)
session = udaExec.connect(method="odbc", system="xxx",username="xxx", password="xxx");
for row in session.execute("show tables {} > {}".format(tables, export_tables)):
     print(row)

与使用 mssql-scripter 下载 .sql 文件的 MSSQL 不同,teradata 是否提供任何此类下载选项。另外,它是否支持下载序列、视图和过程?

对于架构迁移过程,从 teradata 作为源下载这些文件的最佳方法应该是什么?

【问题讨论】:

  • 你考虑过使用FastExport utiliity吗?您可以使用它们的访问模块导出到 S3、HDFS、Kafka、本地文件系统。
  • 数据库不存储 DML,除非你的意思是记录了什么?仍然不确定这是否有意义。对于 DDL,您可以使用数据字典视图(tablesv 等)来构建 show view/table/etc 语句。
  • 对于 Python 的新开发,最好使用支持的 teradatasql 包而不是 teradata。如果存储过程是从存储过程语言编译的,则将源存储在数据库中是默认的但可选的。如果存储,SHOW PROCEDURE 将检索它。否则,对于 SPL 过程以及任何用 Java 或 C/C++ 编写的过程,SHOW 将仅返回 CREATE PROCEDURE 语句。顺便说一句 - 您需要为每个对象发出单独的 SHOW,并将其视为 SELECT - 使用游标并获取结果集,
  • 没有。我不相信有任何内置功能或 python 库可以减轻负担。这完全是关于在DBCSHOW 语句中查询元数据。如果您要从 Teradata 迁移,也许您要迁移到的平台可以提供帮助?
  • 查询 DBC.TablesV 以构建对象名称/类型的列表。使用游标对每个对象执行 SHOW 语句以获取 DDL 文本作为结果集。从光标中获取文本并将其写入一个或多个文件。至于将所有行逆向工程为 INSERT VALUES(您似乎将其称为“提取” DML),这需要付出更多的努力,并且生成的文件会更大。可以做,但效率不高;最好使用某种“批量”数据传输实用程序。

标签: python teradata teradatasql


【解决方案1】:

很高兴分享我得到了这种方法的解决方案。为了获取 sql 格式的文件,请使用给定的代码来提取 DDL 和 DML 代码。

给定的代码用于示例数据库 dbc。

with teradatasql.connect(host='enter_host_ip', user='xxx', password='xxx') as connect:
#get the table name and database name in csv file using select statement
df = pd.read_csv("result.csv", index_col=None)
for tables_name in df['TableName']:
    query = "SHOW TABLE DBC."+ tables_name
    try:
        df = pd.read_sql(query, connect)
        df1 = df['Request Text'][0]
        writePath = "C:\\Users\\SQL\\"+tables_name+".sql"
        with open(writePath, 'a') as f:
            dfAsString = df1
            f.write(dfAsString)
    except Exception as e1:
        print("######################")
        print(tables_name)            
        print("######################")
        pass

注意:在 192 个表中,我能够获得 189 个表的 DDL/DML 脚本。对于表执行人工干预。

【讨论】:

    猜你喜欢
    • 2012-04-25
    • 2018-12-14
    • 2011-02-04
    • 2019-03-31
    • 2021-06-26
    • 2011-10-21
    • 2016-01-02
    • 2019-05-06
    相关资源
    最近更新 更多