当我尝试在 Heroku 上使用 POSTGRESQL 更新我的数据库时,出现 22001 错误
When I try to update my database with PGSQL on Heroku, I get a 22001 error
我正在开发一个在 Heroku 上使用 KnexJS 和 PGSQL 的项目。我的问题是,当我更新 signature_url 字段(文本)时,我收到 PGSQL 22001 错误(详情如下)。正在更新到 signature_url 字段的是一个由 .toDataUrl() JavaScript 方法创建的字符串。此方法 returns 一个长度为 16,158 个字符的字符串。这一切在开发中使用 SQLite3 时似乎工作正常,但当我尝试在 Heroku 上通过 PGSQL 更新时中断。
这是我的迁移:
exports.up = function(knex, Promise) {
return knex.schema.createTable('contracts', function (table) {
table.increments('id')
table.integer('owner_id')
table.integer('signee_id')
table.string('contract_header')
table.text('contract_desc')
table.text('signature_url')
table.string('date_signed')
table.boolean('isSigned')
})
};
exports.down = function(knex, Promise) {
return knex.schema.dropTable('contracts')
};
这是我的原始种子:
exports.seed = function(knex, Promise) {
// Deletes ALL existing entries
return knex('contracts').del()
.then(function () {
// Inserts seed entries
return knex('contracts').insert([
{owner_id: 1, signee_id: 2, contract_header: 'Rugby Coaching Position', contract_desc: 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Donec sollicitudin molestie malesuada.', signature_url: '', date_signed: '', isSigned: false},
{owner_id: 1, signee_id: 2, contract_header: 'Arts Perfomance', contract_desc: 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Donec sollicitudin molestie malesuada.', signature_url: '', date_signed: '', isSigned: false},
{owner_id: 2, signee_id: 1, contract_header: 'Field Trip', contract_desc: 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Donec sollicitudin molestie malesuada.', signature_url: '', date_signed: '', isSigned: false}
]);
});
};
这是在 Dev Tools 上检查网络时返回的对象。
code:"22001"
file:"varchar.c"
length:99
line:"624"
name:"error"
routine:"varchar"
severity:"ERROR"
db.js
function signContract (id, signatureUrl) {
return knex('contracts').where('id', id)
.update({ signature_url: signatureUrl })
}
knexfile.js
module.exports = {
development: {
client: 'sqlite3',
connection: {
filename: './dev.sqlite3'
}
},
staging: {
client: 'postgresql',
connection: {
database: 'my_db',
user: 'username',
password: 'password'
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'knex_migrations'
}
},
test: {
client: 'sqlite3',
connection: {
filename: './dev.sqlite3'
}
},
production: {
client: 'postgresql',
connection: process.env.DATABASE_URL,
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'knex_migrations'
}
}
};
您正在尝试将数据插入 varchar
列,但字符串的长度超过了该列的长度。
您可以插入较短的字符串或使用 ALTER TABLE
来增加 varchar
列的长度。
尝试检查列的类型。因为您的错误表明您正试图将大价值放入小类型中。使用 \d table_name
.
检查 psql
界面中的 table 定义
如果您看到非 text
列 – 尝试将它们替换为
ALTER TABLE tbl_name ALTER COLUMN col_name TYPE text;
我更喜欢使用 text 字段
UPD: 并尝试检查应用程序内部的 NODE_ENV
变量。也许您已连接到 sqlite
数据库。我试图在我的本地 postgres 上重现你的情况,一切正常。
PS 为什么不在 development/test 环境中使用 postgres?例如,您的应用中需要一些仅 postgres
的功能,这意味着您无法在开发中测试您的应用。但这超出了这个问题。
为您的帮助干杯!我采纳了您的想法并将其应用到 KnexJS,方法是通过声明最大字符长度 table.string("signature_url", 17000)
的值来修改我的 table.string("signature_url")
列。这似乎奏效了!
我正在开发一个在 Heroku 上使用 KnexJS 和 PGSQL 的项目。我的问题是,当我更新 signature_url 字段(文本)时,我收到 PGSQL 22001 错误(详情如下)。正在更新到 signature_url 字段的是一个由 .toDataUrl() JavaScript 方法创建的字符串。此方法 returns 一个长度为 16,158 个字符的字符串。这一切在开发中使用 SQLite3 时似乎工作正常,但当我尝试在 Heroku 上通过 PGSQL 更新时中断。
这是我的迁移:
exports.up = function(knex, Promise) {
return knex.schema.createTable('contracts', function (table) {
table.increments('id')
table.integer('owner_id')
table.integer('signee_id')
table.string('contract_header')
table.text('contract_desc')
table.text('signature_url')
table.string('date_signed')
table.boolean('isSigned')
})
};
exports.down = function(knex, Promise) {
return knex.schema.dropTable('contracts')
};
这是我的原始种子:
exports.seed = function(knex, Promise) {
// Deletes ALL existing entries
return knex('contracts').del()
.then(function () {
// Inserts seed entries
return knex('contracts').insert([
{owner_id: 1, signee_id: 2, contract_header: 'Rugby Coaching Position', contract_desc: 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Donec sollicitudin molestie malesuada.', signature_url: '', date_signed: '', isSigned: false},
{owner_id: 1, signee_id: 2, contract_header: 'Arts Perfomance', contract_desc: 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Donec sollicitudin molestie malesuada.', signature_url: '', date_signed: '', isSigned: false},
{owner_id: 2, signee_id: 1, contract_header: 'Field Trip', contract_desc: 'Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Praesent sapien massa, convallis a pellentesque nec, egestas non nisi. Donec sollicitudin molestie malesuada.', signature_url: '', date_signed: '', isSigned: false}
]);
});
};
这是在 Dev Tools 上检查网络时返回的对象。
code:"22001"
file:"varchar.c"
length:99
line:"624"
name:"error"
routine:"varchar"
severity:"ERROR"
db.js
function signContract (id, signatureUrl) {
return knex('contracts').where('id', id)
.update({ signature_url: signatureUrl })
}
knexfile.js
module.exports = {
development: {
client: 'sqlite3',
connection: {
filename: './dev.sqlite3'
}
},
staging: {
client: 'postgresql',
connection: {
database: 'my_db',
user: 'username',
password: 'password'
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'knex_migrations'
}
},
test: {
client: 'sqlite3',
connection: {
filename: './dev.sqlite3'
}
},
production: {
client: 'postgresql',
connection: process.env.DATABASE_URL,
pool: {
min: 2,
max: 10
},
migrations: {
tableName: 'knex_migrations'
}
}
};
您正在尝试将数据插入 varchar
列,但字符串的长度超过了该列的长度。
您可以插入较短的字符串或使用 ALTER TABLE
来增加 varchar
列的长度。
尝试检查列的类型。因为您的错误表明您正试图将大价值放入小类型中。使用 \d table_name
.
psql
界面中的 table 定义
如果您看到非 text
列 – 尝试将它们替换为
ALTER TABLE tbl_name ALTER COLUMN col_name TYPE text;
我更喜欢使用 text 字段
UPD: 并尝试检查应用程序内部的 NODE_ENV
变量。也许您已连接到 sqlite
数据库。我试图在我的本地 postgres 上重现你的情况,一切正常。
PS 为什么不在 development/test 环境中使用 postgres?例如,您的应用中需要一些仅 postgres
的功能,这意味着您无法在开发中测试您的应用。但这超出了这个问题。
为您的帮助干杯!我采纳了您的想法并将其应用到 KnexJS,方法是通过声明最大字符长度 table.string("signature_url", 17000)
的值来修改我的 table.string("signature_url")
列。这似乎奏效了!