【问题标题】:sqlite: Fixtures load null instead of string - NOT NULL constraint failedsqlite:夹具加载 null 而不是字符串 - NOT NULL 约束失败
【发布时间】:2020-01-03 13:33:01
【问题描述】:

我有一个简单的实体,只包含一个字段“名称”:

/**
 * @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;
    }
}

对于这个类,我尝试生成夹具并将它们插入到 sqlite db 中进行测试:

使用应用\实体\性别; 使用 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、PHP 7.4.1、Doctrine Fixtures 3.3.0

【问题讨论】:

  • 这似乎是一个特定于 sqlite 的问题:如果我在我的开发数据库(即 MySql)上运行 bin/console 学说:fixtures:load -n 我没有这样的问题

标签: sqlite doctrine symfony4 fixtures


【解决方案1】:

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

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

/**
 * @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;

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 2021-09-04
    • 2018-08-24
    • 2022-01-19
    • 2021-11-16
    • 2020-12-18
    • 2021-03-20
    • 2020-02-11
    相关资源
    最近更新 更多