迁移时在数据库中创建条目的 symfony 方法是什么?
What is the symfony way to create an entry in db while migrating?
我有一个通过迁移创建的数据库,它是空的,而我希望它被填充。
假设我有一个名为 'books' 的 table 以及 'title' 和 'author'。我想确保至少“Kendall Crolius”的“用狗毛编织”是数据库中的一个条目。
我知道如何在 SQL 中执行此操作,当然,我可以简单地在我的构建过程中放置一个脚本,它执行一个命令来检查是否存在这样的条目,如果不存在则创建它。
但是 Symfony 在 migrating/setup 时在数据库中创建条目的方法是什么?
我想你要找的是灯具:https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
您只需要用您的固定装置(指定 Kendall Crolius 等)和 运行 在迁移过程结束时使用此命令编写一个文件:
php bin/console doctrine:fixtures:load
我不建议使用固定装置,因为它们用于测试和开发环境,库应该在 composer.json 的 require-dev 部分。
您应该使用 migration
创建您的实体
您要找的是数据装置。我认为最受欢迎的两个选项是:
使用前者,您可以在这样的代码中创建固定装置(取自文档):
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
// create 20 products! Bam!
for ($i = 0; $i < 20; $i++) {
$product = new Product();
$product->setName('product '.$i);
$product->setPrice(mt_rand(10, 100));
$manager->persist($product);
}
$manager->flush();
}
}
您可以 运行 他们使用 bin/console doctrine:fixtures:load
。
而后者使用 YAML:
App\Entity\Dummy:
dummy_{1..10}:
name: <name()>
related_dummy: '@related_dummy*'
添加灯具的指令为:bin/console hautelook:fixtures:load
AliceBundle 具有集成 Faker 的额外优势,它可以让您生成随机数据以及您建议的静态数据。
编辑:使用夹具文件的主要原因是您希望独立于底层数据库。当您使用 SQL 脚本时,您可能必须为每个受支持的数据库保留多个版本,有时甚至需要针对不同版本对其进行调整(例如 MySQL 5.7 与 MySQL 8)。另一个好处是,与 SQL 相比,在这些文件的版本历史记录中通常更容易跟踪更改,但这是值得商榷的。由于 Doctrine Fixtures 是用代码编写的,您可以使用检查工具来检查它们是否与您的实体同步,从而更容易发现何时需要更改它们。
话虽如此,如果这些好处中的 none 是一个论点,并且您想使用 SQL 脚本,那么您应该将架构更改和插入数据分开,以防止出现任何问题。可以说您也不应该使用迁移来插入数据。您要么 运行 由于 ID 已被使用而导致迁移失败的风险,要么不依赖于 ID,从而难以管理数据之间的关系。您可以通过 INSERT IGNORE
来避免问题,但是您将很难确定您的数据是否处于您期望的状态,并且 运行 存在不一致的风险。
使用带有 SQL 查询的迁移 (INSERT)。
不要通过实体管理器添加实体,因为您的实体可以更改(例如:添加必填字段,然后迁移将执行错误)
我有一个通过迁移创建的数据库,它是空的,而我希望它被填充。
假设我有一个名为 'books' 的 table 以及 'title' 和 'author'。我想确保至少“Kendall Crolius”的“用狗毛编织”是数据库中的一个条目。
我知道如何在 SQL 中执行此操作,当然,我可以简单地在我的构建过程中放置一个脚本,它执行一个命令来检查是否存在这样的条目,如果不存在则创建它。
但是 Symfony 在 migrating/setup 时在数据库中创建条目的方法是什么?
我想你要找的是灯具:https://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
您只需要用您的固定装置(指定 Kendall Crolius 等)和 运行 在迁移过程结束时使用此命令编写一个文件:
php bin/console doctrine:fixtures:load
我不建议使用固定装置,因为它们用于测试和开发环境,库应该在 composer.json 的 require-dev 部分。 您应该使用 migration
创建您的实体您要找的是数据装置。我认为最受欢迎的两个选项是:
使用前者,您可以在这样的代码中创建固定装置(取自文档):
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
// create 20 products! Bam!
for ($i = 0; $i < 20; $i++) {
$product = new Product();
$product->setName('product '.$i);
$product->setPrice(mt_rand(10, 100));
$manager->persist($product);
}
$manager->flush();
}
}
您可以 运行 他们使用 bin/console doctrine:fixtures:load
。
而后者使用 YAML:
App\Entity\Dummy:
dummy_{1..10}:
name: <name()>
related_dummy: '@related_dummy*'
添加灯具的指令为:bin/console hautelook:fixtures:load
AliceBundle 具有集成 Faker 的额外优势,它可以让您生成随机数据以及您建议的静态数据。
编辑:使用夹具文件的主要原因是您希望独立于底层数据库。当您使用 SQL 脚本时,您可能必须为每个受支持的数据库保留多个版本,有时甚至需要针对不同版本对其进行调整(例如 MySQL 5.7 与 MySQL 8)。另一个好处是,与 SQL 相比,在这些文件的版本历史记录中通常更容易跟踪更改,但这是值得商榷的。由于 Doctrine Fixtures 是用代码编写的,您可以使用检查工具来检查它们是否与您的实体同步,从而更容易发现何时需要更改它们。
话虽如此,如果这些好处中的 none 是一个论点,并且您想使用 SQL 脚本,那么您应该将架构更改和插入数据分开,以防止出现任何问题。可以说您也不应该使用迁移来插入数据。您要么 运行 由于 ID 已被使用而导致迁移失败的风险,要么不依赖于 ID,从而难以管理数据之间的关系。您可以通过 INSERT IGNORE
来避免问题,但是您将很难确定您的数据是否处于您期望的状态,并且 运行 存在不一致的风险。
使用带有 SQL 查询的迁移 (INSERT)。 不要通过实体管理器添加实体,因为您的实体可以更改(例如:添加必填字段,然后迁移将执行错误)