codeigniter 使用CI4将NULL值植入NOT NULL列

scyqe7ek  于 2022-12-25  发布在  其他
关注(0)|答案(1)|浏览(119)

我在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_atupdated_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方法和我代码中的排序。

ukxgm1gy

ukxgm1gy1#

我学到了一两件事试图弄清楚这个问题,所以不妨与任何感兴趣的人分享。随时纠正我,如果我说错了什么,我会很乐意编辑我的答案。
MySQL和PostgreSQL在处理NOT NULL约束方面有一些不同,我的代码没有考虑这些不同。
在尝试使用以下代码播种MySQL数据库时:

$this->db->table('configuracoes')->insert([
            'nome_do_app' => 'App',
            'tema'        => '4',
            'xNome'       => 'name',
            'xFant'       => 'name',
            'CNPJ'        => '0000000000000',
            'telefone'    => '(000) 0000-0000',
            'endereco'    => 'adress'
        ]);

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:我不是从一开始就创建这个数据库的人,我只是在维护和继续一个由别人做的项目。所以我真的不能说任何关于以这种方式构建它的选择。

相关问题