ν¨κ» μλ ,
λ²μ 6.5.0μΌλ‘ μ λ°μ΄νΈν΄μΌ νλ λ²μ μ€λ₯ λ¬Έμ κ° μμμ΅λλ€(6.6.1λ‘ μ λ°μ΄νΈνλ €κ³ νμ§λ§ λ¬Έμ κ° ν΄κ²°λμ§ μμμ΅λλ€. λ¬Έμ #1008 μ°Έμ‘°).
μ΄μ λμ μμ§μ κ°μ μ μ₯νλ €κ³ νλ©΄ ν¨μ¬ λ μμ λ€λ₯Έ μ«μλ‘ λ°λλλ€.
18728.4λ 281.655926290μΌλ‘ λ°λλλ€.
21345.4λ 2898.655926290μΌλ‘ λ°λλλ€.
625348.4λ 16605.845567585λ‘ λ°λλλ€.
&
34348.42λ 15901.675926290μΌλ‘ λ°λλλ€.
5926290
λ‘ λλλ λΉλκ° μμ¬μ€λ½μ΅λλ€.
μ€νμ΄ μ½μμ κ²μλλ©΄ μ€μ λ‘ μ¬λ°λ₯Έ κ°μ΄ νμλ©λλ€. λ°λΌμ 쿼리 ν dbλ‘ λ³κ²½λ©λλ€.
POSTing 12304.53μ μ€μ λ‘ μλνλ©° DBμ κ·Έλλ‘ κΈ°λ‘λ©λλ€.
λλ κ·Έκ²μ μ‘°ν©νμ¬ μ¬μ©νλ€
μνΈ 5.15.1
νμ΄νμ€ν¬λ¦½νΈ: 3.3.4000
λ
Έλ: 10.15.3
Azure MS SQL λ°μ΄ν°λ² μ΄μ€
νλλ λ€μκ³Ό κ°μ΄ μ μλ©λλ€.
numResult: {
type: DECIMAL(18, 9),
},
μ΄κ²μ λν ms sql λ°μ΄ν°λ² μ΄μ€κ° ν΄λΉ νλμ λν΄ μ€μ€λ‘ λ§νλ κ²μ λλ€.
μΆκ° μ λ³΄κ° νμνλ©΄ μλ €μ£Όμμμ€.
κ·Έλμ λ°μ΄ν°λ² μ΄μ€μ λ€λ₯Έ λꡬλ₯Ό ν΅ν΄ κ°μ νμΈνλ©΄ μ°μ¬μ§ κ°μ΄ μλͺ»λ κ²μΈκ°? μ΄μ λν ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±νλ €κ³ ν©λλ€.
κΈμ, λλ κ°μ κΈ°λ‘νκΈ° μν΄ λ΄ nodeJs μ°μν μλ²λ₯Ό μ¬μ©νκ³ λν κ°μ΄ μ¬λ°λ₯Έ 쿼리λ₯Ό λ΄ λλ€.
κ·Έλ° λ€μ DBeaverλ₯Ό μ¬μ©νμ¬ DBμ μλͺ»λ κ°μ΄ νμλ©λλ€.
Sequelizeμ ν¨κ» GETνλ©΄ λ¬Όλ‘ μλͺ»λ κ°λ λ°νλ©λλ€.
@arthurschreiber μ°Έκ³ λ‘ #1008μμ μ€λͺ ν λ¬Έμ λ₯Ό μμ ν ν μ§λ£¨ν v6.6.1λ‘ μ λ°μ΄νΈνμ΅λλ€. μ΄ λ¬Έμ μ λν΄ μ°¨μ΄λ₯Ό λ§λ€μ§ μμμ§λ§
μ΄ λ¬Έμ κ° λ°μνλ μ΄μ λ°/λλ ν΄κ²° λ°©λ²μ΄ μ΄λ»κ² μκ²Όλμ§ μλ €μ£Όλ μ¬λμ΄ μμ΅λκΉ?
@obermobber μ΅λν 빨리 보λλ‘ νκ² μ΅λλ€.
λ€, κ°μ¬ ν©λλ€ @arthurschreiber ! μ λ§ λ λ―ΈμΉκ² νλꡬλ νν
@obermobber μ¬νμ μλνμ§λ§ μ€ν¨νμ΅λλ€.
μ΄ λ¬Έμ μ κ²μν κ°μ μ¬μ©νμ¬ test/integration/parameterised-statements-test.js
μ μμ§λ² ν
μ€νΈμ μ ν
μ€νΈ μΌμ΄μ€λ₯Ό μΆκ°νμ§λ§ SQLServerλ‘ μ¬λ°λ₯΄κ² μ μ‘λ©λλ€.
λ³΄κ³ μλ λ¬Έμ λ₯Ό κ°λ¨ν ν μ€νΈ μ¬λ‘λ‘ μμ½ν μ μμ΅λκΉ? π
@arthurschreiber λΆλλ½μ§λ§ 짧μ κ°λ°μ μν λμ λ¨ ν λ²λ ν μ€νΈλ₯Ό μμ±ν μ μ΄ μμ΅λλ€(λμ μΌμ΄μ§λ§..). νμ§λ§ νμν λͺ¨λ μ 보λ₯Ό κΈ°κΊΌμ΄ μ 곡νκ² μ΅λλ€. :(
μ§λ£¨ν ν μ€νΈλ₯Ό μν΄ μ¬μ©νλ νλ μμν¬λ‘ μμ±λ ν μ€νΈ μΌμ΄μ€μΌ νμλ μμ΅λλ€.
μ΄ λ¬Έμ λ₯Ό μ¬νν μ μλ μ΅μνμ μ½λλ§ μμΌλ©΄ λ©λλ€. π
κ·Έλμ, λλ κ·Έκ²μ΄ λ§μκΈ°λ₯Ό λ°λλλ€.
λ΄κ° μ€ννλ λͺ¨λ κ²μ λ€μκ³Ό κ°μ΅λλ€.
@Post('/test')
private async postDecimalTest(
@Body() body: testCaseBody
) {
try {
const transaction = await sequelize.transaction();
await DB.TestExecutionValues.create({
testId: body.testId,
numResult: body.numResult,
strResult: body.strResult,
enumResultSid: body.enumResult,
unitId: body.unitId,
ynPassed: body.ynPassed,
comment: body.comment,
}, { transaction });
await transaction.commit();
return { message: 'success posting test' };
} catch (e) {
console.log(e);
throw e;
}
}
λλ μ΄ λͺΈμ 보λΈλ€:
{
"testId": "LEVEL",
"numResult": 465324.75,
"strResult": "testcase",
"enumResult": "1",
"unitId": "mΒ³",
"ynPassed": 1,
"comment": ""
}
μ΄κ²μ κΈ°λ‘λ κ²μ λλ€:
Executing (036ca06b3c1869b4851b): BEGIN TRANSACTION;
Executing (036ca06b3c1869b4851b): INSERT INTO [TestExecutionValues] ([testId],[numResult],[strResult],[enumResultSid],[unitId],[ynPassed],[comment]) OUTPUT INSERTED.* VALUES (<strong i="13">@0</strong>,<strong i="14">@1</strong>,<strong i="15">@2</strong>,<strong i="16">@3</strong>,<strong i="17">@4</strong>,<strong i="18">@5</strong>,@6);
Executing (036ca06b3c1869b4851b): COMMIT TRANSACTION;
κ·Έλ¦¬κ³ μ΄κ²μ DBμ μ°μ¬μ§ λ΄μ©μ λλ€:
{
"testId": {
"id": "LEVEL",
"description": null
},
"numResult": 4156.148157261,
"strResult": "testcase",
"enumResult": {
"id": "#N/A",
"description": null
},
"unit": {
"id": "mΒ³",
"description": null
},
"ynPassed": true,
"comment": ""
}
λ°λΌμ 465324.75 λ 4156.148157261 λ‘ λ°λλλ€.
λλ κ·Έκ²μ΄ μ€μν κ²½μ° μμ²μ λν΄ λΌμ°ν
컨νΈλ‘€λ¬ 0.7.7μ μ¬μ©ν©λλ€.
λ€λ₯Έ μ λ³΄κ° νμνμλκΉ? (μλλ©΄ μ²μλΆν° κ·Έ λͺ¨λ κ²μ΄ μ³μμ΅λκΉ?)
ν μ΄λΈ μ μκ° νμν μ μλ€κ³ μκ°νμ΅λλ€.
const TestExecutionValues = sequelize.define('TestExecutionValues', {
sid: {
type: INTEGER,
autoIncrement: true,
primaryKey: true,
allowNull: false,
},
testId: {
type: STRING,
references: {
model: Tests,
key: 'testId',
},
},
numResult: {
type: DECIMAL(18, 9),
},
strResult: {
type: STRING,
},
enumResultSid: {
type: INTEGER,
references: {
model: EnumResults,
key: 'sid',
},
},
unitId: {
type: STRING,
references: {
model: Units,
key: 'unitId',
},
},
ynPassed: {
type: BOOLEAN,
},
comment: {
type: TEXT,
},
}, {
timestamps: false,
});
μ§λ£¨ν κ² μμ μνΈμ μ¬μ©νλ κ² κ°μ΅λλ€. μ΄λ μΌμ΄ μλͺ»λ μ μλ μμ§μ΄λ λΆλΆμ΄ λ λ§κΈ° λλ¬Έμ λ¬Έμ λ₯Ό μΆμ νκΈ° μ΄λ ΅κ² λ§λλ κ²½μ°κ° λ§μ΅λλ€. π
DB.TestExecutionValues
λ μ΄λ»κ² ꡬνλλμ? π€
μ, λ°©κΈ μ μλ₯Ό κ²μνμ ¨μ΅λλ€. λ΄κ° 무μμ ν μ μλμ§ μμλ³Ό κ².
λ€, μνλΌμ΄μ μ΄μ
μ© DBλλΌμ΄λ²λ‘ μ§λ£¨νκ² μ¬μ©νκ³ μμ΅λλ€..
λμμ΄ λμλ€λ©΄ μ΄ νλμ DBeaver μ€ν¬λ¦°μ·μ
λλ€.
μ¬κΈ° λ΄κ° λ°©κΈ μ±μ°μ§ν μκ° μμ΅λλ€.
const { Connection, Request, TYPES: { Decimal } } = require('tedious');
const connection = new Connection({
// ...
});
connection.on('connect', () => {
const request = new Request('CREATE TABLE #decimals (value decimal(18, 9))', (err) => {
if (err) {
throw err;
}
const request = new Request('INSERT INTO #decimals (value) VALUES (@value)', (err) => {
if (err) {
throw err;
}
const request = new Request('SELECT * FROM #decimals', (err) => {
if (err) {
throw err;
}
connection.close();
});
request.on('row', (columns) => {
console.log(columns);
});
connection.execSql(request);
});
request.addParameter('value', Decimal, 18728.4, { precision: 18, scale: 9 });
connection.execSql(request);
});
connection.execSqlBatch(request);
});
μ΄κ²μ λ΄κ° λ€μ μ»λ μΆλ ₯μ λλ€.
[ { value: 18728.4,
metadata:
{ userType: 0,
flags: 9,
type: [Object],
collation: undefined,
precision: 18,
scale: 9,
udtInfo: undefined,
dataLength: 17,
schema: undefined,
colName: 'value',
tableName: undefined } } ]
λλ μ΄κ²μ΄ tedious
μ λ¬Έμ λΌκ³ μκ°νμ§ μμ΅λλ€. π€ λ°μ΄ν°λ² μ΄μ€μ λν΄ μ΄ λμΌν μ½λλ₯Ό μ€ννκ³ λ€λ₯Έ κ²°κ³Όκ° λνλλμ§ νμΈν μ μμ΅λκΉ?
sequelize
λ₯Ό ν΅ν΄ μ΄λ€ λ²μ μ tedious
λ₯Ό μ¬μ©νκ³ μμ΅λκΉ?
ν ... ν΄λ³Όκ²μ κ°μ¬ν©λλ€!
νμ¬ λΆμ΄ μμ
RequestError: Requests can only be made in the LoggedIn state, not the SentPrelogin state
νμ§λ§ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €κ³ νλ λμ μ¬κΈ° λ΄ ν¨ν€μ§ μ κΈμ μ€λ μ·μ΄ μμ΅λλ€(μ§λ£¨ν¨μ νμ μ‘°μΉμ μ’ μμ±μ λμ΄λμ§ μμΌλ©° μ΄κ²μ λ΄ ν¨ν€μ§ μ κΈμμ μ§λ£¨ν¨μ μ μΌν λ°μμ λλ€).
"tedious": {
"version": "6.6.2",
"resolved": "https://registry.npmjs.org/tedious/-/tedious-6.6.2.tgz",
"integrity": "sha512-0Yziuys2h66dVlqMPJpNFciQ/N2VrgwY8o8TXyj4OZBaxrvqRPeMuTKZZVBFTGOjt/J15fR0fX0HBnCHjm7QWA==",
"requires": {
"@azure/ms-rest-nodeauth": "2.0.2",
"@types/node": "^12.7.11",
"@types/readable-stream": "^2.3.5",
"bl": "^3.0.0",
"depd": "^2.0.0",
"iconv-lite": "^0.5.0",
"jsbi": "^3.1.1",
"native-duplexpair": "^1.0.0",
"punycode": "^2.1.0",
"readable-stream": "^3.4.0",
"sprintf-js": "^1.1.2"
},
μ, μ½λλ₯Ό λ€μκ³Ό κ°μ΄ λ³κ²½νλ©΄
const { Connection, Request, TYPES: { Decimal } } = require('tedious');
const connection = new Connection({
// ...
});
connection.on('connect', (err) => {
if (err) {
throw err;
}
const request = new Request('CREATE TABLE #decimals (value decimal(18, 9))', (err) => {
if (err) {
throw err;
}
const request = new Request('INSERT INTO #decimals (value) VALUES (@value)', (err) => {
if (err) {
throw err;
}
const request = new Request('SELECT * FROM #decimals', (err) => {
if (err) {
throw err;
}
connection.close();
});
request.on('row', (columns) => {
console.log(columns);
});
connection.execSql(request);
});
request.addParameter('value', Decimal, 18728.4, { precision: 18, scale: 9 });
connection.execSql(request);
});
connection.execSqlBatch(request);
});
μ°κ²°μ μ€ν¨νλ©΄ λ λμ μ€λ₯ λ©μμ§κ° νμλ©λλ€.
κ·Έκ²μ μ€μ λ‘ λ§μ λμμ΄ λμμ΅λλ€. μ λ encryption
μ¬μ°μ΄ μμμ΅λλ€.
λ€μμ΄ λ§μμΌκ² μ£ ?
const connection = new Connection({
server: 'server',
authentication: {
type: 'default',
options: {
userName: 'user',
password: 'password',
}
},
options: {
encrypt: true,
database: 'dbname'
}
});
λλ DBeaverμ λμΌν μ격 μ¦λͺ
μ μ¬μ©νκ³ μλ¬΄λ° λ¬Έμ κ° μμμ§λ§ νμ ConnectionError: Login failed for user 'user'.
λ₯Ό λ°μμ΅λλ€.
λ΄ νμ μ°κ²° μ€μ μ μ μΌν μ°¨μ΄μ μ λ°©μΈ μ΅μ
μ΄μ§λ§ μ¬κΈ°μμ μ°Ύμ§ λͺ»νμ΅λλ€. http://tediousjs.github.io/tedious/api-connection.html
λͺ¨λ λ¬Έμ μ λν μ κ°!
λ§μμΌ ν΄! μ°κ²°νλ €λ μ¬μ©μκ° SQLServer μ¬μ©μμ
λκΉ μλλ©΄ Azure Active Directory κ³μ μ¬μ©μμ
λκΉ? (Azure λ°μ΄ν°λ² μ΄μ€μ λ μ€ νλκ° μμ μ μμ). default
λμ azure-active-directory-password
λ₯Ό μΈμ¦ μ νμΌλ‘ μ¬μ©ν΄ 보μΈμ.
μ΄κ²μ μ μκ² ν κ±Έμ λ λ€κ°κ°κ² νμ΅λλ€. μ΄μ (node:67210) UnhandledPromiseRejectionWarning: ConnectionError: Security token could not be authenticated or authorized.
λ₯Ό λ°μ΅λλ€.
κ·Έλ¬λ μ΄κ²μ νλμ κ΅¬μ± μΈ‘λ©΄μμ λ λ§μ λ¬Έμ μΈ κ² κ°μ΅λλ€. (μ μ΄λ ꡬκΈμ΄ μ λ₯Ό μ§μνλ κ³³μ
λλ€ νν)
μ΄ λ¬Έμ μ κ΄λ ¨νμ¬ λͺ¨λ κ²μ΄ μ§λ£¨νμ§ μμ λ€λ₯Έ κ³³μμ μ€λ₯λ₯Ό κ°λ¦¬ν€λ κ² κ°μ΅λλ€. κ·Έλμ μ°λ¦¬λ μ΄κ²μ λ«μ μ μκ³ μλ§λ μνΈνμ κ΄λ ¨λ λ¬Έμ λ₯Ό μ κΈ°ν κ²μ λλ€.
@arthurschreiber μκ°μ λ΄μ£Όμ μ μ λ§ κ°μ¬ν©λλ€!!
ν . μ κ³μν΄μ Sequelizeλ₯Ό μ¬μ©νμ¬ μ°κ²°ν μ μμ§λ§ tedious
λ₯Ό μ¬μ©νμ§ μλμ§ κΆκΈν©λλ€. π¬
μ΄ λ¬Έμ λ₯Ό λ«κ³ tedious
μμ λ¬Έμ κ° λ°μνμμ νμΈν ν λ€μ μ¬μμμ€. π
λλ λΉμ κ³Ό ν¨κ» μ΄ λ―Έμ€ν°λ¦¬λ₯Ό νΈλ κ²μ κ±°μ νμ§ μμ κ²μ λλ€ νν! νμ§λ§ λλ λ μ΄μ λΉμ μ μκ°μ 보λ΄κ³ μΆμ§ μμμ΅λλ€ π