Knex ๋ฒ์ : 0.16.3 (TypeScript knexfile ์ฌ์ฉ)
๋ฐ์ดํฐ๋ฒ ์ด์ค + ๋ฒ์ : PostgreSQL 10.5
์ด์์ฒด์ : Windows 10 Pro 64 Bit
knex migrate:make somename
์คํํ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
Requiring external module ts-node/register
Using environment: development
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
at assertPath (path.js:39:11)
at Object.resolve (path.js:166:7)
at directories.map.directory (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:82:28)
at Array.map (<anonymous>)
at MigrationGenerator._absoluteConfigDirs (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:81:24)
at MigrationGenerator._ensureFolder (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:41:23)
at MigrationGenerator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:35:17)
at Migrator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\Migrator.js:122:27)
at Command.commander.command.description.option.action (X:\Code\node\knextest\node_modules\knex\bin\cli.js:179:10)
at Command.listener (X:\Code\node\knextest\node_modules\commander\index.js:315:8)
at Command.emit (events.js:182:13)
at Command.parseArgs (X:\Code\node\knextest\node_modules\commander\index.js:654:12)
at Command.parse (X:\Code\node\knextest\node_modules\commander\index.js:474:21)
at Liftoff.invoke (X:\Code\node\knextest\node_modules\knex\bin\cli.js:278:13)
at Liftoff.execute (X:\Code\node\knextest\node_modules\liftoff\index.js:203:12)
at module.exports (X:\Code\node\knextest\node_modules\flagged-respawn\index.js:51:3)
์ด๊ฒ์ ๋ด knexfile.ts
์ ๋ด์ฉ์
๋๋ค.
module.exports = {
development: {
client: 'pg',
connection: {
host: 'localhost',
database: 'postgres',
user: 'postgres',
password: 'pw',
},
migrations: {
directory: 'migrations',
},
},
};
์ถ๊ฐ ์ธ๋ถ ์ ๋ณด :
knex migrate:make somename
knexfile ํ์ฅ์๋ฅผ .js
๋ณ๊ฒฝํ๋ฉด ์๋ํฉ๋๋ค. (knex 0.16.3)knex migrate:make somename
๋ knex 0.15.1 ๋ฐ @types/knex
0.15.1 ํจํค์ง๋ฅผ ์ฌ์ฉํ ๋ TypeScript knexfile๊ณผ ํจ๊ป ์๋ํฉ๋๋ค.๋๋ ์ด๊ฒ์ด ์๋ง๋ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค : https://github.com/tgriesser/knex/issues/2998
0.15.2
์์๋ ์๋ํ์ง๋ง 0.16.x
์์๋ ์๋ํ์ง ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์๋ง๋ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค : # 2998
0.15.2์์๋ ์๋ํ์ง๋ง 0.16.x์์๋ ์๋ํ์ง ์์ต๋๋ค.
์๋์, ์ด๊ฒ์ ๋ค๋ฅธ ๋ฌธ์ ์ ๋๋ค. ์ฃผ์ด์ง ์ ๋ณด๋ก๋ # 2998์ ์ฌํ ํ ์ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
์๋ knexfile ํด๊ฒฐ์ด knexfile.ts๋ฅผ ์ฐพ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฉด --knexfile knexfile.ts
์ธ์๋ฅผ ๋ช
๋ น์ ์ ๋ฌํ๊ฑฐ๋ ๋ค์์ ์ฌ์ฉํ์ฌ ๋ง์ด๊ทธ๋ ์ด์
์์ฑ๊ธฐ ๋ช
๋ น์ ์ง์ ๊ฒฝ๋ก๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๋ค.
knex migrate:make --migrations-directory . -x ts migration-name
ํด๋ผ์ด์ธํธ๊ฐ ์๋์ผ๋ก knexfile.ts๋ฅผ ์ฐพ์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ migrate:latest
์์ ์ด๊ฒ์ ์ฒ์ ๋ฐ๊ฒฌํ๋๋ฐ, ํฅ๋ฏธ๋กญ๊ฒ๋ migrate:make
์๋ ๋ค๋ฅธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ค์์ ๋ ๋ค ๋ณผ ์์๋ ๊ฐ๋จํ ์ฌํ์
๋๋ค. https://github.com/jrr/knex-ts-issue-repro
๋ํ ์ค๋ knex --knexfile knexfile.ts migrate:make (...)
๋ .ts ๋์ .js ํ์ผ์ ์์ฑํฉ๋๋ค. (์ด์ ์๋ knex๊ฐ ์๋์ผ๋ก knexfile.ts
๋ฅผ ์ ํํ๋ฉด .ts ๋ง์ด๊ทธ๋ ์ด์
๋ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.)
๋ํ PostgreSQL ์๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ Knex
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
knex migrate:latest --knexfile knexfile.ts
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
knex seed:run --knexfile knexfile.ts
--knexfile knexfile.ts
๋ knexfile.js
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์ต๋๋ค. typescript๋ ๊ตฌ์ฑ ํ์ผ์ ๋ํ ์ ํ ๊ฒ์ฌ๋ฅผ ์ ๊ณต ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๊ทธ๊ฒ์ ๊ณ ์น ๊ณํ์ด ์์ต๋๊น? ์ด ๋ฌธ์ ๋ก Knex ์ฑํ์ ๋๋ฆฌ๋ ๊ฒ์ด ์ด๋ ค์ ์ต๋๋ค.
@dgadelha ์๋ฆผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ค๋ ๋๋ ๋ด์ผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
@dgadelha 0.17.6์ด ๋ฆด๋ฆฌ์ค๋์์ต๋๋ค. ์ํ๊น๊ฒ๋ knexfile ํ์ฅ์์ ํ์ฅ์ ํด๊ฒฐํ๊ธฐ์ํ ์์ ์ฌํญ์ ๋ง์คํฐ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค (์ง๊ธ๋ถํฐ ์์).
๊ฒํ ํ์๊ธฐ ๋ฐ๋๋๋ค!
https://github.com/tgriesser/knex/pull/3282
๋ํ ์ค๋
knex --knexfile knexfile.ts migrate:make (...)
๋ .ts ๋์ .js ํ์ผ์ ์์ฑํฉ๋๋ค. (์ด์ ์๋ knex๊ฐ ์๋์ผ๋กknexfile.ts
๋ฅผ ์ ํํ๋ฉด .ts ๋ง์ด๊ทธ๋ ์ด์ ๋ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.)
@kibertoad ๋ฐฉ๊ธ
@mathieumg ๋ค. ๋ช ๋ถ ์ ์ ์์ฑํ๊ณ ์ด๋ฒ ํธ์์ ์ฐธ์กฐํ PR์ ์ฐธ์กฐํ์ญ์์ค.
@kibertoad ๋ด๊ฐ ํ์ด! ์ค๋ช ์ ์คํ๋ ค Knexfile๊ณผ ๋์ผํ ํ์ฅ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฅ์๋ฅผ ์ถ๋ก ํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋ฏ๋ก ํ์คํ์ง ์์์ต๋๋ค.
The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile
-> ์, ๋ช
์ ์ ์ผ๋ก ์ง์ ๋ ๊ฒ์ด ๋ ์๋ ํด๊ฒฐ ๋ ํ์ผ์ด๋ ์๊ด์์ด knexfile์์ ํ์ฅ์ ์๋์ผ๋ก ์ถ๋ก ํ๋ ๊ฒ์
๋๋ค.
0.17.6 TS knexfile์ ๊ณ ์ ์๋ ํด์๋.
์ข๊ตฌ๋! extension: "ts"
0.17.6์ด ์ฌ์ ํ ".js"๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฒ๊ทธ๋ฅผ ์์ ํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ๐
ํ์ฅ์๊ฐ "ts"์ธ 0.17.6์ด ์ฌ์ ํ ".js"๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
์, ๋น์ ์ knexfile์ด
{
...
migrations: {
extension: "ts"
}
๊ทธ ์์? https://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1 ์์ ์์ ๋์์ต๋๋ค.์ด ์ปค๋ฐ์์ ๋ฒ์ ์ ์ ๊ทธ๋ฉด ์ด๋ฏธ ์ก์ธ์ค ํ ์ ์์ต๋๋ค (๋ง์คํฐ๋ฅผ ์ง์ ๊ฐ๋ฆฌํค๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ).
๋ถํํ๋ 0.17๋ก ๋ฐฑ ํฌํธ๋์ง ์์ต๋๋ค.
0.18.0์ ์ฌ์ ํ โโ์๋นํ ์์ ์์ง๋ง ์ปค๋ฐ์ ๋ฐ๋ผ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ ๋์ next-1์ ๋ฆด๋ฆฌ์ค ํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์, PR์ ๋๊ธ์ ๋ฌ์์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
@kibertoad ๊ต์ฅํฉ๋๋ค, ์ ํ์ฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์คํธ๋ ์ค์์ด 0.18์ ๊ธฐ๋ค๋ฆด ์ ์์ต๋๋ค. ๐
@kibertoad ์ฐธ์กฐํ๋ ์ปค๋ฐ์ ๋ฐ๋ก ์๋์ ์ ์ ๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค.
module.exports = {
migrations: {
extension: 'ts';
}
}
๊ทธ๋ฌ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ฃ๊ณ ์ฝ์ ์์น๋ฅผ ์ ์ํ๋ ๋ง์ด๊ทธ๋ ์ด์ ๊ฐ์ฒด๋ ์๋์ ์ ์๋์ด์ผํฉ๋๋ค.
module.exports = {
[environment]: {
migrations: {
directory: './migrations';
}
}
migrations
๊ฐ์ฒด๋ฅผ ํ๊ฒฝ ๊ฐ์ฒด ๋ฐ์ผ๋ก ์ด๋ํ๋ฉด ๋ง์ด๊ทธ๋ ์ด์
๋๋ ํฐ๋ฆฌ๊ฐ ๋ฌด์๋ฉ๋๋ค.
@ViggoV ๋ฒ๊ทธ ์ ๊ณ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ค๋ ์ด๊ฒ์ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
@ViggoV ์ต์ ๋ง์คํฐ๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ง๊ธ ๊ทํ์ ๊ฒฝ์ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง๋ณด๊ณ ํ ์ ์์ต๋๊น?
0.18.0-next2์์ ์ถ์๋จ
์ฃ์กํฉ๋๋ค. { ext: 'ts' }
ํ๋๋ฐ ์์๋๋ก ์๋ํ์ง๋ง ๋ฌธ์ํ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์๊ฐ์ด์์ ๋ ํ
์คํธํ๊ฒ ์ต๋๋ค
์๋ ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๋ค. ๋ค์๊ณผ ๊ฐ์ด knexfile.ts์ ts-node / register๊ฐ ํ์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
`
ํ์ ( 'ts-node / register')
const s = require ( "./ settings.js");
module.exports = {
client: 'pg',
connection: {
user: s.user,
host: s.host,
database: 'starwars',
password: s.password,
ssl: true
}
};
`
์ด๋ฏธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ ๊ฒฝ์ฐ์๋ ํด๊ฒฐ์ฑ ์ด ๋งค์ฐ ๊ฐ๋จํ์ต๋๋ค. _knexfile.js_ ๋ฅผ ํ๋ก์ ํธ์ ๋ฃจํธ๋ก "/ backend" ๋๋ ํ ๋ฆฌ์ knex๋ฅผ ์ค์นํ์ง๋ง ์ ์์๋ ์ด์ ๋ก ํ์ผ์ด ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ์ต๋๋ค. ๊ทธ๋์ knexfile.js๋ฅผ "backend / knexfile.js" ๋ก ์ฎ๊ธฐ๊ณ ๋งค๋ ฅ์ฒ๋ผ ์๋ํฉ๋๋ค. ๋๊ตฐ๊ฐ์๊ฒ ๋์์ด ๋๊ธธ ๋ฐ๋๋๋ค.
์๋
ํ์ธ์ @moacirandretti , ๋ด knexfile.ts ๋ฃจํธ ํ๋ก์ ํธ์ ์์ง๋ง cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
์ด ๋ฉ์์ง๋ฅผ ๋ฐํํ์ญ์์ค.
Running knex --knexfile knexfile.ts migrate: latest on โฌข backend-ecolab ... up, run.5056 (Free)
Failed to load external module ts-node / register
Failed to load external module typescript-node / register
Failed to load external module typescript-register
Failed to load external module typescript-require
Failed to load external module sucrase / register / ts
Failed to load external module @ babel / register
Error: Cannot find module 'ts-node / register'
Require stack:
- /app/knexfile.ts
- /app/node_modules/knex/bin/cli.js
at Function.Module._resolveFilename (internal / modules / cjs / loader.js: 966: 15)
at Function.Module._load (internal / modules / cjs / loader.js: 842: 27)
at Module.require (internal / modules / cjs / loader.js: 1026: 19)
at require (internal / modules / cjs / helpers.js: 72: 18)
at Object. <anonymous> (/app/knexfile.ts:1:1)
at Module._compile (internal / modules / cjs / loader.js: 1138: 30)
at Object.Module._extensions..js (internal / modules / cjs / loader.js: 1158: 10)
at Module.load (internal / modules / cjs / loader.js: 986: 32)
at Function.Module._load (internal / modules / cjs / loader.js: 879: 14)
at Module.require (internal / modules / cjs / loader.js: 1026: 19)
์ด ํจํค์ง ts-node ๋ฅผ dev ์ข ์์ฑ์ ์ค์นํ์ต๋๋ค.
๋๋ ๊ฐ์ ์ค๋ฅ์ ์ง๋ฉดํ๋ค.
knexfile.ts :
import dotenv from "dotenv";
import { Config } from "knex";
dotenv.config();
interface KnexConfig {
[name: string]: Config;
}
const knexConfig: KnexConfig = {
development: {
client: "pg",
connection: {
host: process.env.DB_HOST || "127.0.0.1",
user: process.env.DB_USERNAME || "postgres",
password: process.env.DB_PASSWRORD || "postgres",
database: process.env.DB_DEV_NAME || "done_list",
},
migrations: {
directory: "./migrations",
extension: "ts",
},
},
test: {
client: "pg",
connection: {
host: process.env.DB_HOST || "127.0.0.1",
user: process.env.DB_USERNAME || "postgres",
password: process.env.DB_PASSWRORD || "postgres",
database: process.env.DB_DEV_NAME || "done_list_test",
},
},
};
export { knexConfig };
knex migrate:make user
์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง ์ด ์ฃผ์์์ ์ธ๊ธ ํ๋๋ก knex migrate:make --migrations-directory ./scr/migrations -x ts user
์คํํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ์ดํ ์คํฌ๋ฆฝํธ : 4.0.2
knex : 0.21.5
@ types / knex : 0.16.1
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ํ PostgreSQL ์๋ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ
Knex
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ฑํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.--knexfile knexfile.ts
๋knexfile.js
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ์ํ์ง ์์ต๋๋ค. typescript๋ ๊ตฌ์ฑ ํ์ผ์ ๋ํ ์ ํ ๊ฒ์ฌ๋ฅผ ์ ๊ณต ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.