谷歌云数据存储的ORM

时间:2013-05-20 03:12:56

标签: python orm google-cloud-datastore

https://developers.google.com/datastore/docs/overview

它看起来像GAE中的数据存储区但没有ORM(对象关系模型)。 我是否可以在GAE for Cloud Datastore上使用与数据存储区相同的ORM模型? 或者是否可以为Cloud Datastore找到任何ORM支持?

6 个答案:

答案 0 :(得分:4)

App Engine数据存储区高级API,包括第一方(db,ndb)和第三方(objectify,slim3),都是基于低级API构建的:

替换这些接口/类的App Engine特定版本以在Google Cloud Datastore API之上工作将允许您在App Engine之外使用这些高级API。

高级API代码本身不应该(很多)改变。

答案 1 :(得分:3)

Google Cloud Datastore仅提供低级API(protojson)来发送数据存储区RPC。

NDB和类似的更高级别的库可以调整为使用较低级别的包装器,如googledatastorereference)而不是google.appengine.datastore.datastore_rpc

答案 2 :(得分:3)

对于那里的.NET人员,我刚刚创建了pogo,这是一个支持将POCO保存到Google Cloud Datastore并使用LINQ查询它们的.NET ORM。

它在nuget上可用,称为“pogo”,源代码在此处托管 - http://code.thecodeprose.com/pogo

例如,这是一个插入和一个查找:

var unique = Guid.NewGuid().ToString();

var poco = new TestDepartment
{
    Id = unique,
    Code = 123,
    Director = new TestEmployee { FirstName = "Boss" }
};

using (var session = _datastore.OpenSession())
{
    session.Store(poco);
    session.SaveChanges();
    var lookupPoco = session.Load<TestDepartment>(unique).SingleOrDefault();

    Assert.AreEqual("Boss", lookupPoco.Director.FirstName);
}

这是一个查询:

using (var session = _datastore.OpenSession())
{
    var results = session.Query<TestEmployee>()
          .Where(t => t.HourlyRate > 50.0)
          .ToList();

    Assert.IsTrue(results.Count > 0);
}

答案 3 :(得分:1)

这不是一个确切的答案,我们已经知道Google正在为NDB Library工作,我等不及了。

我尝试的是编写datastore_v1_pb2.py中未列出的NDB属性,例如GeoPt

class GCDFoo(ndb.Model):
    latlng = ndb.GeoPtProperty()

在这种情况下,如果我们通过GCD低级API读取实体,则返回如下。

name: "latlng"
value {
  entity_value {
    property {
      name: "x"
      value {
        double_value: 10.0
        indexed: false
      }
    }
    property {
      name: "y"
      value {
        double_value: 10.0
        indexed: false
      }
    }
  }
  meaning: 9
}
嗯,我真的不知道'含义'是什么意思,但描述GeoPt很重要。 现在我们可以编写像这样的GeoPt属性。

def make_geopt_value(lat,lng):
  entity = datastore.Entity()
  prop = entity.property.add()
  datastore.helper.set_property(prop,'x',lng,indexed=False)
  prop = entity.property.add()
  datastore.helper.set_property(prop,'y',lat,indexed=False)
  value = datastore.Value()
  datastore.helper.set_value(value,entity)
  value.meaning = 9
  return value

它对我有用,但仍然不知道它是否正确。无论如何,我希望我的答案对于那些无法等待NDB库的人有所帮助。

答案 4 :(得分:1)

您可以看一看,这是用Typescript编写的

说明:ts-datastore-orm目标是为数据存储区(数据存储区模式下的Firestore)提供强大的类型化和结构化ORM功能。

https://www.npmjs.com/package/ts-datastore-orm


import {BaseEntity, Batcher, Column, datastoreOrm, Entity, Transaction, DatastoreOrmDatastoreError, DatastoreOrmError} from "ts-datastore-orm";

@Entity({namespace: "testing", kind: "user", compositeIndexes: [{id: "desc"}, {string: "asc", ["object.name"]: "asc", __ancestor__: false}]})
export class User extends BaseEntity {
    @Column({generateId: true})
    public id: number = 0;

    @Column()
    public date: Date = new Date();

    @Column({index: true})
    public string: string = "";

    @Column()
    public number: number = 10;

    @Column()
    public buffer: Buffer = Buffer.alloc(1);

    @Column()
    public array: number[] = [];

    @Column({excludeFromIndexes: ["object.name"]})
    public object: any = {};

    @Column()
    public undefined: undefined = undefined;

    @Column()
    public null: null = null;
}


async function queryExamples() {
    const [user1, requestResponse1] = await User.query().runOnce();
    const [userList1, requestResponse2] = await User.findMany([1, 2, 3, 4, 5]);
    const [userList2, requestResponse3] = await User.findMany({ancestor: user1, ids: [1, 2, 3, 4, 5]});
    const [userList3, requestResponse4] = await User.query().run();

    const user2 = User.create({id: 1});
    const query = TaskGroup.query()
        .filter("number", "=", 10)
        .filterAny("anyColumn.name", ">", 5)
        .setAncestor(user2)
        .groupByAny("anyColumn.name")
        .orderAny("anyColumn.name", {descending: true})
        .offset(5)
        .limit(10);

    while (query.hasNextPage()) {
        const [entities] = await query.run();
    }

    // stream
    const stream = query.runStream()
        .on("data", (entity) => {
            //
        })
        .on("info", (info) => {
            //
        })
        .on("error", (error) => {
            //
        })
        .on("end", () => {
            //
        });
}

答案 5 :(得分:0)

是。您不仅可以使用相同的ORM模型,Google Cloud Datastore还允许您从当前的App Engine应用程序存储中读取和写入。

https://developers.google.com/datastore/docs/activate?hl=en#google_cloud_datastore_for_an_existing_app_engine_application