我有一个应用程序需要导入.sql文件。我可以使用mysql -u my_user -pMyPassword db_name < import.sql
从命令行导入文件,但我想将其移动到我的应用程序中。我有一些事情需要在进口之前完成,其他的则需要在进口之后完成。现在我必须把它分成三步。我找到的最接近解决方案是获得连接(DoctrineDBALConnection
)并使用exec()
,但即使我的源文件是正确的,它也会引发语法错误。我猜它是在试图对事物进行转义,并对SQL进行双重转义。该文件是使用mysqldump
生成的。
Symfony使用Doctrine,您可以使用:
php app/dev_console doctrine:database:import import.sql
您可以使用DBAL"import"命令并执行sql。无论如何,这比直接使用mysql命令的性能要差,因为它将整个文件加载到内存中。
否则,我建议您使用自己的Symfony控制台命令。
在我的情况下是:
php bin/console doctrine:database:import my_sql_file.sql
2021年9月状态:
我更信任Doctrine\Bundle\DoctrineBundle\Command\Proxy\ImportDoctrineCommand中的代码,它在execute函数中调用了弃用警告。忽略弃用警告不是一种好的编程实践。由于开销的原因,调用dual:run sql的效率不够。或者,您也可以在操作系统级别调用例如mysql。这会在多用户环境中造成问题,例如,因为必须在命令行中指定数据库密码。此外,服务器还必须激活此功能;exec()在许多环境中出于安全原因被关闭,尤其是在低成本的提供程序中。此外,此函数不会是数据库抽象函数。这种抽象是学说最突出的特点之一。
因此,我建议您自己读取SQL数据并逐行执行(请参阅entityManager->createNativeSQL()函数)。这样,您就有更好的机会对可能出现的错误做出反应。