node.js - Knex 迁移不创建表
问题描述
最近我一直在尝试将 knexjs 与 docker 一起使用,但遇到了奇怪的错误。当我使用以下命令在容器内运行 knex migrate:latest 时: docker exec service sh -c "knex migrate:latest"; 一切正常,但表实际上并没有在数据库中创建。
我的迁移:
exports.up = knex => {
return Promise.all([
knex.schema.createTable('users', table => {
table.increments('id').primary();
table.string('name').notNullable();
table.string('username').unique().notNullable();
table.string('email').unique().notNullable();
table.string('password').notNullable();
table.datetime('created_at').notNullable();
}),
knex.schema.createTable('user_settings', table => {
table.integer('user_id');
table.integer('xp');
}),
])
}
exports.down = knex => {
return Promise.all([
knex.schema.dropTable('users'),
knex.schema.dropTable('user_settings'),
])
}
我的 Knex 文件
module.exports = {
client: 'pg',
debug:true,
connection: {
host:'postgres',
user: 'postgres',
password: 'postgres',
port: '',
database: 'users'
},
migrations: {
tableName: 'knex_migrations'
}
};
我的码头工人撰写
version: '3'
services:
postgres:
image: postgres
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 10
volumes:
- ./postgres:/app
ports:
- "5432:5432"
users:
container_name: users-service
restart: always
build: ./users
depends_on:
- postgres
volumes:
- ./users:/app
ports:
- '3000:3000'
我可以看到序列 knex_migrations_id_seq、knex_migrations_lock_index_seq 和 users_id_seq 已创建。
解决方案
Knex 不会在不创建表格的情况下创建序列。我已经尝试使用我用于 Stack Overflow 问题的本地测试设置进行迁移,它工作正常(堆栈使用docker-compose
,尽管配置与您的配置略有不同)。
表格似乎不存在的原因可能有多种,具体取决于您使用什么来查找它们。最简单的方法可能是使用以下方法连接到您的数据库:
psql postgres://postgres:postgres@localhost/users
然后发出\dt
命令。如果您没有看到列出的表格,您可以尝试\dn+
显示每个可用的架构和权限。\d users
通过(或什至)专门询问表格\d public.users
可能会有所帮助。
如果您仍然无法“看到”这些表格,也许可以编辑您的问题,详细说明您如何测试它们,并且有人可能会提供进一步的帮助。
这是一个简单的docker-compose.yml
,您可以尝试迁移:
version: '3.1'
services:
postgres:
image: postgres:11
restart: always
environment:
POSTGRES_PASSWORD: example
POSTGRES_USER: example
POSTGRES_DB: users
ports:
- 5432:5432
adminer:
image: adminer
restart: always
ports:
- 8080:8080
如果 psql 不是您的首选工具,您可以使用http://localhost:8080上的管理员 Web 界面浏览数据库。
推荐阅读
- c# - 在这种情况下如何显示 Stack 对象?
- c++ - OpenCV:linearPolar 不是 cv 的成员
- android-studio - 修复 Android Studio 中的版本冲突
- powershell - 如何检索作为 VSTS 构建/发布的一部分运行的 PowerShell 脚本中的变量?
- mongodb - MongoDB - 仅在日期时间中使用 $lte 数小时
- java - Spring Security 自定义 AuthenticationException
- c# - 通过 .NET Core Api 从请求中获取文件
- java - maven - 指定 java 编译器颠覆
- .net - 正则表达式不匹配某些字符
- python - 多线程 python 代码停止工作,直到进程终止