【问题标题】:Best practices when migrating data from one database scheme to another?将数据从一种数据库方案迁移到另一种数据库方案时的最佳实践?
【发布时间】:2009-11-19 12:59:44
【问题描述】:

当我在做一个项目时,我经常发现自己在查看数据库方案并且不得不导出数据以使用新方案。

很多时候,数据库中存储的数据相当粗糙。我的意思是它存储了许多未经过滤的字符。我发现我自己编写了自定义 php 脚本来过滤这些信息并创建一个干净的 UTF-8 CSV 文件,然后我将其重新导入我的新数据库。

我想知道是否有更好的方法来处理这个问题?

【问题讨论】:

    标签: etl


    【解决方案1】:

    我建议在移动数据时使用 ETL 工具,或者至少遵循 ETL 做法。考虑到您已经在进行清洁,您可能会遵循整个 ECCD 路径——提取、清洁、整合、交付。如果您自己进行清理,请考虑保存中间 csv 文件以进行调试和审核。

    1. Extract (as is, junk included) to file_1
    2. Clean file_1 --> file_2
    3. Conform file_2 --> file_3
    4. Deliver file_3 --> DB tables
    

    如果您归档文件 1-3 并记录脚本的版本,您将能够在出现错误时回溯。

    ETL 工具(如 Microsoft SSIS、Oracle 数据集成器、Pentaho 数据集成器)连接到各种数据源并提供大量转换和分析任务。

    【讨论】:

      【解决方案2】:

      没有人回答这个问题,但我曾经需要快速迁移数据库并最终使用sqlautocode,这是一种从现有数据库自动生成(python orm)模型的工具 - 该模型使用了很棒的@ 987654322@orm 库。它甚至会生成一些示例代码,以便开始使用......(见下文)

      令人惊讶的是,它开箱即用。您没有完整的迁移,而是一种以编程方式访问所有表的简单方法(在 python 中)。

      我没有在那个项目中这样做,但是您当然也可以为目标数据库自动生成 orm 层,然后编写一个脚本,将正确的行传输到所需的结构中。

      一旦你将你的数据库内容放入 python,你将能够处理 u'unicode',即使这需要一些尝试,取决于实际的粗略程度......

      示例代码:

      # some example usage
      if __name__ == '__main__':
      db = create_engine(u'mysql://username:password@localhost/dbname')
      metadata.bind = db
      
      # fetch first 10 items from address_book
      s = customers.select().limit(10)
      rs = s.execute()
      for row in rs:
          print row
      

      【讨论】:

        【解决方案3】:

        你可以考虑Logstash

        logstash 是一个管理事件和日志的工具。您可以使用它来收集日志、解析它们并存储它们以供以后使用(例如,用于搜索)

        Logstash 像管道一样操作每个事件/日志:输入 |过滤器 |输出。 Logstash 有许多输入插件来接受不同的来源/格式,您可以使用过滤器来解析您的源数据,然后输出到您需要的多个输出/格式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-11
          相关资源
          最近更新 更多