Postgres 的 CDS 数据库服务
欢迎使用 PostgreSQL 数据库服务 SAP 云应用编程模型 以简化数据库架构和 页:1 驱动程序 。 。 。 .
设置
一般来说,你只需要安装数据库软件包,如下所示:
npm add @cap-js/postgres
学习更多关于设置和使用 各自的数据库指南。 。 。 .
支助
此项目可通过下列方式对特性请求/建议、错误报告等开放: GitHub 问题。 。 。 .
捐款
鼓励并始终欢迎各方作出贡献和反馈。 关于如何作出贡献的更多信息,项目结构以及额外贡献信息见我们 贡献准则。 。 。 .
版本
这个图书馆跟随 语义版本。 。 。 . 所有显著变化均记录在 变动情况。 。 。 .
行为守则
作为成员、贡献者和领导人,我们保证使参加我们的社区成为每个人不受骚扰的经历。 通过参与这个项目,你同意遵守 行为守则 在任何时间.
许可证发放
版权2023 SAP SE或SAP下属公司和CDs-dbs撰稿人. 请看我们的 自由主义 版权和许可证信息。 详细信息,包括第三方组成部分及其许可证/版权信息 通过REUSE工具。 。 。 .
移徙指南 cds-pg 改为 @cap-js/postgres
@cap-js/postgres 用于替换 cds-pg。 。 。 .
但是,一些初步检查和清理有助于:
- 用于使用 BTP Postgres 超缩放器作为数据库,
- 知所取证自入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入出入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入
VCAP_SERVICES.postgres(中文(简体) ) - 服务绑定标签为
postgresql-db cds-dbm替换为手工制作的"db-deploper"app → 见下文
- 知所取证自入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入出入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入入
- 您的本地语言
package.json: 您可以安全删除条目cds.requires.postgres以往的强制性cds-pg - 建议: 设置掩体 var
DEBUG=sql在本地开发时查看 PostgreSQL 的 DB 级输出
计划迁移
@cap-js/postgres 从SAP HANA和SQLite中得知的 PostgreSQL 带来了同样的计划进化能力.
允许在现有情况下进行计划迁移 cds-pg-基于项目包括生成和部署您数据库结构的"csn-snapshot".
地方发展
首先,为演变奠定基础
$> cds deploy --model-only
- 这将创建表格 cds_model 为移徙计划奠定基础
随后的部署可通过 $> cds deploy
在BTP上,云创始环境
以上"csn-snapshots"可通过下列程序执行: mtar- 基础方法。 同时,同样 mtar 可用于之后的 PostgreSQL 部署(带有schema演化).
除了促进计划的演变之外,还有两个主要步骤 mtar。 。 。 .
- 创建本地文件夹
deployer(任何名称的工作) - 内
deployer创建一个package.json包含
...
"//npm run migrate": "only one-time!",
"migrate": "cds deploy --model-only",
"//npm run deploy": "subsequent deployments",
"deploy": "cds deploy"
...
- 向您添加一节
/mta.yaml标注deployer目录作为运行一次性的独立应用程序
- name: pg-db-deployer
type: custom
path: deployer
parameters:
buildpacks: nodejs_buildpack
no-route: true
no-start: true
disk-quota: 2GB
memory: 512MB
tasks:
- name: migrate
command: npm run migrate
# # for subsequent deployments
# - name: deploy
# command: npm run deploy
disk-quota: 2GB
memory: 512MB
build-parameters:
before-all:
custom:
- npm i
# generate the "csn-snapshot" - only necessary for one-time migration,
# can be commented out on subsequent deployments
- cds compile '*' -2 json > deployer/schema.csn
ignore: ["node_modules/"]
requires:
- name: pg-database
resources:
- name: pg-database
parameters:
path: ./pg-options.json
service: postgresql-db
service-plan: trial # change to yours!
skip-service-updates:
parameters: true
service-tags:
- plain
type: org.cloudfoundry.managed-service
需要考虑的移民点
混合案件标识符
即使没有双引号的列名称在PostgreSQL中被折叠为小写(yourName - > (中文) yourname, (中文(简体) ), "yourName" - > (中文) yourName, (中文(简体) ),
您可以使用您从您的 .cds 文档来引用它们.
示例: brewery_id 在 DB 级别 - > brewery_ID 在CDS级别
原为w/ cds-pg 您必须遵循 DB 级别 : SELECT.from(Beers).columns('brewery_id').groupBy('brewery_id')
现在,重新使用CDS定义: SELECT.from(Beers).columns('brewery_ID').groupBy('brewery_ID')
所以,请调整你的 CQL 相应声明.
时区( 可能值) 破坏变化(中文(简体) )
任何日期 - + 时间类型都将存储在 UTC 在实际数据字段中没有任何时区标识符。 。 。 .
CAP的出入境适配器负责将进出数据转换到理想的时区.
所以当一个 datetime 进来了 iSO 8601 标准 兼容格式
2009-01-01T15:00:00+01:00 2009年1月1日15:00,维也纳(CEST)
将被存储为
2009-01-01T13:00:00 (2009年1月1日13:00,协调世界时).
请注意这个概念, 并依靠客户端在您想要的时区( 格式) 解析 UTC .
cds.DatabaseService 消费
InsertResult 现在只返回受影响的行及其 ID编号.
const entries = [
{ name: 'Beer1', /* ... */ },
{ name: 'Beer2', /* ... */ },
{ name: 'Beer3', /* ... */ }
]
const insertResult = await cds.run(INSERT.into(Beers).entries(entries))
expect(insertResult.affectedRows).to.equal(3)
const beers = [...insertResult] //> this calls the [Symbol.iterator] method of the insert result
// beers:
// [
// { ID: "f81d7ee5-922b-48a1-a12a-a899b8594c99" },
// { ID: "ddda7f8e-e26b-430f-a80c-ac2c7df29510" },
// { ID: "7228c40f-0046-4f53-8a2b-3d55ad825f59" }
// ]
单位 cds-pg,我们额外浮出整个插入的数据集.
// continuing after the insert of the above example:
// const insertResult = await cds.run(INSERT.into(Beers).entries(entries))
// this works NO MORE - see above
const beers = insertResult.results
expect(beers.length).toStrictEqual(3)
expect(beers[0].ID).toMatch(uuidRegex)
expect(beers[0].createdAt.toISOString()).toMatch(timestampRegex)
expect(beers[0].modifiedAt.toISOString()).toMatch(timestampRegex)
请相应调整运行时间编码 .