我在CodeIgniter 4 seeder上遇到了一个问题,到目前为止我还没有找到任何解决方案。我使用CodeIgniter 4迁移来生成我的表,默认情况下列是NOT NULL
。在MySQL中播种数据库没有任何问题,即使我只插入了一些列,这会使其他任何列都变成NULL.
问题是,如果我改用PostgreSQL,迁移运行良好。我只需要将DOUBLE
更改为NUMERIC
。seeder就不那么容易了。我得到的第一个错误是Message: pg_query(): Query failed: ERROR: null value in column "created_at" violates not-null constraint
,这很奇怪,因为使用MySQL时,这些列是正常填充的。但即使我手动告诉我的迁移填充create_at
和updated_at
,我在任何其他NOT NULL
列中不断得到这个错误,而在MySQL中它们只是被留为空。
在这种情况下,我想我对CI4、MySQL或PostgreSQL有些误解,如果有人能解释一下,我会很高兴。
总结一下,我尝试使用PostgreSQL播种数据库,它在MySQL中运行良好,但它不允许我在播种器中未指定的几十个其他字段中插入任何值。我担心这会在表单和类似的事情中出现问题,因为一些未填充的字段将导致相同的错误。
为了澄清一些问题,下面是我的数据库中一个表的迁移:
class Configuracoes extends Migration
{
public function up()
{
$this->forge->addField([
'id_config' => [
'type' => 'INT',
'constraint' => 9,
'usigned' => true,
'auto_increment' => true,
],
'nome_do_app' => [
'type' => 'VARCHAR',
'constraint' => 128
],
'tema' => [
'type' => 'INT'
],
'xNome' => [
'type' => 'VARCHAR',
'constraint' => 128
],
'xFant' => [
'type' => 'VARCHAR',
'constraint' => 128
],
'CNPJ' => [
'type' => 'VARCHAR',
'constraint' => 14
],
'telefone' => [
'type' => 'VARCHAR',
'constraint' => 11
],
'endereco' => [
'type' => 'VARCHAR',
'constraint' => 256
],
'arquivo-imagem-de-fundo-login' => [
'type' => 'VARCHAR',
'constraint' => 128
],
'logomarca' => [
'type' => 'VARCHAR',
'constraint' => 128
],
'created_at' => [
'type' => 'DATETIME'
],
'updated_at' => [
'type' => 'DATETIME'
],
'deleted_at' => [
'type' => 'DATETIME'
]
]);
$this->forge->addKey('id_config', true);
$this->forge->createTable('configuracoes');
}
以及此表的播种机:
$this->db->table('configuracoes')->insert([
'nome_do_app' => 'App',
'tema' => '4',
'xNome' => 'name',
'xFant' => 'name',
'CNPJ' => '0000000000000',
'telefone' => '(000) 0000-0000',
'endereco' => 'adress'
]);
你可以看到seeder只填充了一些列,所以运行它时我会得到和以前一样的错误,询问每个缺失的列。我总是可以用空格填充缺失的列,它会运行得很好,但我需要理解为什么会发生这种情况,以及它是否会干扰POST
方法和我代码中的排序。
1条答案
按热度按时间ukxgm1gy1#
我学到了一两件事试图弄清楚这个问题,所以不妨与任何感兴趣的人分享。随时纠正我,如果我说错了什么,我会很乐意编辑我的答案。
MySQL和PostgreSQL在处理
NOT NULL
约束方面有一些不同,我的代码没有考虑这些不同。在尝试使用以下代码播种MySQL数据库时:
seeder遗漏的任何内容都将被赋予一个
NULL
值,MySQL不会对此提出抱怨,即使字段被定义为NOT NULL
。虽然我不确定它是如何深入工作的,但这是我在尝试解决这个问题时所看到的。PostgreSQL与MySQL的另一个不同之处是
date
字段类型。当将此字段NULL
保留在MySQL数据库中时,它会自动将其设置为0000-00-00 00:00:00:000
。但PostgreSQL不会接受这样的值,当然也不会接受NULL
。除非您告诉PostgreSQL在该字段中接受NULL
值。这将只是一个空字段,就像其他字段一样。我的代码也没有考虑到这个变化。使用PostgreSQL,如果一个字段被设置为
NOT NULL
,你不能简单地告诉PostgreSQL插入一个NULL
值,甚至手动也不行。我的整个数据库都被设置为NOT NULL
,因为这对MySQL来说永远不会是一个问题。解决方案:我检查了所有的迁移,只在实际需要值的字段中留下了
NOT NULL
,然后在播种表时,我考虑了NOT NULL
字段,并手动插入了一个默认值,如空格或零。谢谢所有想帮忙的人!
PSA:我不是从一开始就创建这个数据库的人,我只是在维护和继续一个由别人做的项目。所以我真的不能说任何关于以这种方式构建它的选择。