https://developers.google.com/datastore/docs/overview
它看起来像 GAE 中的数据存储,但没有 ORM(对象关系模型)。我可以在 GAE for Cloud Datastore 上使用与数据存储相同的 ORM 模型吗?或者是否可以为 Cloud Datastore 找到任何 ORM 支持?
https://developers.google.com/datastore/docs/overview
它看起来像 GAE 中的数据存储,但没有 ORM(对象关系模型)。我可以在 GAE for Cloud Datastore 上使用与数据存储相同的 ORM 模型吗?或者是否可以为 Cloud Datastore 找到任何 ORM 支持?
App Engine Datastore 高级 API,无论是第一方(db、ndb)还是第三方(objectify、slim3),都构建在低级 API 之上:
将这些接口/类的 App Engine 特定版本替换为在Google Cloud Datastore API之上工作将允许您在 App Engine 之外使用这些高级 API。
高级 API 代码本身不应该(太多)改变。
Google Cloud Datastore仅提供低级 API(proto和json)来发送数据存储 RPC。
NDB和类似的更高级别的库可以适应使用像googledatastore (参考) 这样的较低级别的包装器,而不是google.appengine.datastore.datastore_rpc
对于那里的 .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);
}
这不是一个确切的答案,我们已经知道 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 图书馆的人有所帮助。
你可以看看这个,这个是用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", () => {
//
});
}
是的。您不仅可以使用相同的 ORM 模型,Google Cloud Datastore 还允许您从当前的 App Engine 应用存储中读取和写入。