5

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

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

4

6 回答 6

4

App Engine Datastore 高级 API,无论是第一方(db、ndb)还是第三方(objectify、slim3),都构建在低级 API 之上:

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

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

于 2013-05-21T13:47:49.040 回答
3

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

NDB和类似的更高级别的库可以适应使用像googledatastore (参考) 这样的较低级别的包装器,而不是google.appengine.datastore.datastore_rpc

于 2013-05-20T20:25:21.310 回答
3

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

它在 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);
}
于 2013-07-02T03:22:30.703 回答
1

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

我尝试的是编写未列出的 NDB 属性datastore_v1_pb2.py,例如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 图书馆的人有所帮助。

于 2013-10-16T10:47:19.193 回答
1

你可以看看这个,这个是用Typescript写的

说明:ts-datastore-orm 旨在为 Datastore(Datastore 模式下的 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", () => {
            //
        });
}
于 2020-02-03T16:27:31.807 回答
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

于 2013-05-20T05:32:45.140 回答