通过 volume 外挂自己的配置#
The default configuration for MySQL can be found in
/etc/mysql/my.cnf
, which may!includedir
additional directories such as/etc/mysql/conf.d
or/etc/mysql/mysql.conf.d
. Please inspect the relevant files and directories within themysql
image itself for more details.
$ docker run –name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
环境设置:
Public Key Retrieval is not allowed
docker 运行命令:
docker run --name mysql-demo -v D:\docker-volume\mysql-volume:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
开始 Strapi#
更改数据库连接方式#
创建 strapi mysql 数据库,更改 mysql 连接参数(默认是 sqlite):
// config\database.ts
import path from 'path';
export default ({ env }) => {
// const client = env('DATABASE_CLIENT', 'sqlite');
const client = env('DATABASE_CLIENT', 'mysql');
const connections = {
mysql: {
connection: {
host: env('DATABASE_HOST', 'localhost'),
port: env.int('DATABASE_PORT', 3306),
database: env('DATABASE_NAME', 'strapi'),
user: env('DATABASE_USERNAME', 'strapi'),
password: env('DATABASE_PASSWORD', 'strapi'),
ssl: env.bool('DATABASE_SSL', false) && {
key: env('DATABASE_SSL_KEY', undefined),
cert: env('DATABASE_SSL_CERT', undefined),
ca: env('DATABASE_SSL_CA', undefined),
capath: env('DATABASE_SSL_CAPATH', undefined),
cipher: env('DATABASE_SSL_CIPHER', undefined),
rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', true),
},
},
pool: { min: env.int('DATABASE_POOL_MIN', 2),
max: env.int('DATABASE_POOL_MAX', 10) },
},
postgres: {
// ...
},
sqlite: {
connection: {
filename: path.join(__dirname, '..', '..', env('DATABASE_FILENAME', '.tmp/data.db')),
},
useNullAsDefault: true,
},
};
return {
connection: {
client,
...connections[client],
acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),
},
};
};
创建数据#
配置一对多#
首先业务涉及2张表:PageWeb 和 PageVersion,我们前端项目都是单页面应用,通过 PageVersion 来维护迭代版本,项目名称等信息通过 PageWeb 维护,并通过一对多和 PageVersion 关联。
即:PageVersion
最终效果将是这样:
restful api#
http://localhost:1337/api/web-pages
{
"data": [
{
"id": 13,
"documentId": "m3yldqawekgqgy4kvdam1eo8",
"createdAt": "2025-05-08T06:06:20.566Z",
"updatedAt": "2025-05-08T06:06:20.566Z",
"publishedAt": "2025-05-08T06:06:20.598Z",
"name": "gzw",
"desc": "公众号"
},
{
"id": 15,
"documentId": "p7v44adl2hy0ir0nbbm6z2z4",
"createdAt": "2025-05-08T06:06:35.511Z",
"updatedAt": "2025-05-08T06:06:35.511Z",
"publishedAt": "2025-05-08T06:06:35.537Z",
"name": "zzt",
"desc": "掌政通"
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 25,
"pageCount": 1,
"total": 2
}
}
}
http://localhost:1337/api/web-pages?populate=versions
{
"data": [
{
"id": 13,
"documentId": "m3yldqawekgqgy4kvdam1eo8",
"createdAt": "2025-05-08T06:06:20.566Z",
"updatedAt": "2025-05-08T06:06:20.566Z",
"publishedAt": "2025-05-08T06:06:20.598Z",
"name": "gzw",
"desc": "公众号",
"versions": [
{
"id": 7,
"documentId": "pk23ycxdfug4i5v1kzfo3dgo",
"version": "1.0.0",
"createdAt": "2025-05-08T06:06:48.819Z",
"updatedAt": "2025-05-08T06:06:48.819Z",
"publishedAt": "2025-05-08T06:06:48.852Z",
"desc": "fix"
},
{
"id": 9,
"documentId": "i2qtaq68sgc0cfaycoh59j4j",
"version": "1.1.0",
"createdAt": "2025-05-08T06:07:01.937Z",
"updatedAt": "2025-05-08T06:07:01.937Z",
"publishedAt": "2025-05-08T06:07:01.967Z",
"desc": "fix"
}
]
},
{
"id": 15,
"documentId": "p7v44adl2hy0ir0nbbm6z2z4",
"createdAt": "2025-05-08T06:06:35.511Z",
"updatedAt": "2025-05-08T06:06:35.511Z",
"publishedAt": "2025-05-08T06:06:35.537Z",
"name": "zzt",
"desc": "掌政通",
"versions": [
{
"id": 11,
"documentId": "ktft0c0apjfd6spjqsj2yyg3",
"version": "1.0.0",
"createdAt": "2025-05-08T06:07:13.250Z",
"updatedAt": "2025-05-08T06:07:13.250Z",
"publishedAt": "2025-05-08T06:07:13.281Z",
"desc": null
}
]
}
],
"meta": {
"pagination": {
"page": 1,
"pageSize": 25,
"pageCount": 1,
"total": 2
}
}
}
http://localhost:1337/api/web-pages?populate[versions][sort][0]=version%3Adesc&populate[versions][filters][enabled][$eq]=active&populate[versions]&filters[name][$eq]=gzh&pagination[limit]=1
关联关系的维护#
不像查询,增删改对安全的敏感度更高,需要设置对应 token:
比如我对 page 模块单独定义了 PageAccess 用户对这类 restful 操作的权限设置:
为什么要设置 find?
因为对于 relation 关系的数据不光要设置 create,update,还需要 find,内部他要查询到才能关联上。
首先定义一个页面版本记录:
curl --location --request POST 'http://192.168.13.115:1337/api/page-versions' \
--header 'Authorization: Bearer 141ca7491....d3f8' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"version": "2.0.3",
"desc":"添加一个restful版本",
"enabled":"active"
}
}'
{
"data": {
"id": 34,
"documentId": "z1v8n4qqybce2twapn9e79uy",
"version": "2.0.3",
"createdAt": "2025-05-12T05:15:05.499Z",
"updatedAt": "2025-05-12T05:15:05.499Z",
"publishedAt": "2025-05-12T05:15:05.516Z",
"desc": "添加一个restful版本",
"enabled": "active"
},
"meta": {}
}
对于页面来说,需要关联上面这条数据:
curl --location --request PUT 'http://192.168.13.115:1337/api/web-pages/m3yldqawekgqgy4kvdam1eo8' \
--header 'Authorization: Bearer 141ca7491....d3f8' \
--header 'Content-Type: application/json' \
--data-raw '{
"data": {
"versions":{
"connect":["z1v8n4qqybce2twapn9e79uy"]
}
}
}'
问题#
生产环境下,如何修改数据结构?#
由于开发环境基于 npm run dev
可以自动修改数据结构,生产环境还是需要老实实调用 sql 脚本迁移
strapi 是否支持增删修改?#
支持,需要配置 token 来控制修改权限