https://developers.google.com/datastore/docs/overview
它看起来像GAE中的数据存储区但没有ORM(对象关系模型)。 我是否可以在GAE for Cloud Datastore上使用与数据存储区相同的ORM模型? 或者是否可以为Cloud Datastore找到任何ORM支持?
答案 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(proto和json)来发送数据存储区RPC。
NDB和类似的更高级别的库可以调整为使用较低级别的包装器,如googledatastore(reference)而不是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应用程序存储中读取和写入。