sqlite:固定装置加载 null 而不是字符串 - NOT NULL 约束失败

sqlite: Fixtures load null instead of string - NOT NULL constraint failed

我有一个仅包含一个字段的简单实体 "name":

/**
 * @ORM\Table(name="gender")
 * @ORM\Entity
 * @codeCoverageIgnore
 */
class Gender
{
    public const FEMALE = 'female';
    public const MALE = 'male';
    public const OTHER = 'other';

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=15, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private string $name;

    public function getName(): string
    {
        return $this->name;
    }

    public function setName(string $name): Gender
    {
        $this->name = $name;

        return $this;
    }
}

为此 class 我尝试生成固定装置并将它们插入到 sqlite 数据库中进行测试:

使用App\Entity\Gender; 使用 Doctrine\Bundle\FixturesBundle\Fixture; 使用 Doctrine\Persistence\ObjectManager;

class GenderFixtures extends Fixture
{

    public function load(ObjectManager $manager)
    {
        $genders = [Gender::FEMALE, Gender::MALE, Gender::OTHER];

        foreach ($genders as $genderName) {
            echo $genderName . PHP_EOL;

            $gender = (new Gender())
                ->setName($genderName);
            $manager->persist($gender);
        }

        $manager->flush();
    }
}

当我打电话给

 bin/console  doctrine:fixtures:load --env=test

我明白了:

female
male
other

In AbstractSQLiteDriver.php line 39:

  An exception occurred while executing 'INSERT INTO gender (name) VALUES (null)':             

  SQLSTATE[23000]: Integrity constraint violation: 19 NOT NULL constraint failed: gender.name 

如您所见,我想将三个字符串用作名称。为什么插入语句中的Fixture不使用它们?

Symfony 4.4,PHP7.4.1,Doctrine Fixtures 3.3.0

填充 sqlite 数据库的固定装置似乎无法处理主键,它们不是自动递增的整数。

相同的固定装置在 MySql 数据库上工作就像一个魅力。所以只要我想使用 sqlite 数据库进行单元测试,我就添加到我所有的实体中

/**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="smallint", options={"unsigned":true})
 * @ORM\GeneratedValue(strategy="IDENTITY")
 */
private ?int $id = null;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=15, nullable=false)
 */
private string $name;

当然,我必须更改连接实体的命名和引用列。

我仍然不知道使用与开发和生产不同的数据库进行测试是否明智。像这样的问题表明它不是一个理想的解决方案。

当我在本地做 运行 一个类似的应用程序时,我只有另一个 MySql 数据库用于测试。现在我 运行 这个应用程序在 docker 并且在使用不同的数据库进行测试时遇到了麻烦,而不是用于开发。因此 sqlite 解决方案....