【问题标题】:Migration to GAE迁移到 GAE
【发布时间】:2009-09-28 23:39:58
【问题描述】:

将 MySQL 表迁移到 Google Datastore 并为其创建 python 模型的最佳方法是什么?

我有一个 PHP+MySQL 项目,我想迁移到 Python+GAE 项目。到目前为止,最大的障碍是迁移表并创建相应的模型。每个表大约有 110 列宽。手动为表创建模型有点繁琐,更不用说创建加载器和导入生成的 csv 表表示了。

有没有更有效的方式来进行迁移?

【问题讨论】:

    标签: python django google-app-engine google-cloud-datastore


    【解决方案1】:

    一般来说,自动生成模型应该不会困难。假设每个表都有一个 csv 文件,其中的行由(字段名称、数据类型)组成,那么这样的事情就可以完成:

    # Maps MySQL types to Datastore property classes
    type_map = {
        'char': 'StringProperty',
        'text': 'TextProperty',
        'int': 'IntegerProperty',
        # ...
    }
    
    def generate_model_class(classname, definition_file):
      ret = []
      ret.append("class %s(db.Model):" % (classname,))
      for fieldname, type in csv.reader(open(definition_file)):
        ret.append("  %s = db.%s()" % (fieldname, type_map[type]))
      return "\n".join(ret)
    

    定义架构后,您可以直接从数据库批量加载 - 无需中间 CSV 文件。有关该主题,请参阅 my blog post

    【讨论】:

      【解决方案2】:

      approcket 可以从google mysql⇌gae 或gae 内置远程api

      【讨论】:

      • 虽然是目前为止最好的,但approcket 有问题并且没有很好的文档记录。它也不会生成模型。
      【解决方案3】:

      在您的情况下,我会编写一个一次性 Python 脚本来读取现有的 MySQL 架构(使用 MySQLdb),生成一个 models.py 以匹配(然后对生成的代码进行一些手动检查和编辑,以防万一)。这是假设每个实体具有“大约 110 个”属性的数据模型是您满意并且想要保留的东西,当然;可能值得借此机会将事情分解一下(实际上,如果您当前的方法还依赖于联接或 GAE 未提供的其他 SQL 功能,您可能不得不这样做),但这当然需要更多的手动工作。

      一旦数据模型到位,bulk loading 就可以发生,通常通过中间 CSV 文件(您可以通过多种方式生成这些文件)。

      【讨论】:

      • 这就是我下定决心要做的事情。我想知道是否有人已经创建了这样的工具。
      • @msaeed,AFAIK,目前还没有公开可用的“迁移辅助工具”。大多数使用关系数据库的项目都需要大量的手动工作来仔细地对模式进行非规范化以避免连接等,因此仅仅将模式机械转录到模型并不是那么有用...:-(
      • @Alex,谢谢。 (Un-)幸运的是,我的模式已经非规范化了。
      【解决方案4】:

      【讨论】:

        【解决方案5】:

        你可以migrate them to django models first

        特别使用

        python manage.py inspectdb > models.py
        

        然后编辑 models.py 直到满意为止。您可能需要放入 ForeignKeys,调整 CharFields 的长度等。

        我已经成功地将几个遗留数据库转换为 django。

        然而,Django 模型与 GAE 模型(我不太熟悉)不同,所以我不知道这可能不是很有帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-10
          相关资源
          最近更新 更多