gpt4 book ai didi

mysql - Doctrine 总是返回相同的记录和模式 :update fails

转载 作者:行者123 更新时间:2023-11-29 05:19:55 25 4
gpt4 key购买 nike

我正在尝试将现有数据库与 Symfony/Doctrine 一起使用,但似乎没有任何效果。

导入(数据库到映射)成功,src/xxx/Entity 中生成的文件看起来不错。

但是,有两个问题:

问题:

Doctrine 想要在我小得可笑的数据库上运行 13 个查询。我以为导入之后,Doctrine 会同步到在线数据库。然而,事实并非如此。

如果我不修改数据库(因为某些原因)会更好,无论如何 doctrine:schema:update 完全失败:

### doctrine:schema:update --dump-sql
ALTER TABLE categorie CHANGE id id TINYINT(1) NOT NULL;
ALTER TABLE produit CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE categorie_id categorie_id TINYINT(1) DEFAULT NULL, CHANGE derniere_maj derniere_maj DATETIME NOT NULL;
DROP INDEX fk_produit_categorie1_idx ON produit;
CREATE INDEX IDX_29A5EC27BCF5E72D ON produit (categorie_id);
ALTER TABLE commande_client CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE client_id client_id INT DEFAULT NULL, CHANGE date_creation date_creation DATETIME NOT NULL, CHANGE no_confirmation no_confirmation INT NOT NULL;
DROP INDEX fk_commande_client_client1_idx ON commande_client;
CREATE INDEX IDX_C510FF8019EB6921 ON commande_client (client_id);
ALTER TABLE commande_client_vers_produit DROP quantite, CHANGE commande_client_id commande_client_id INT NOT NULL, CHANGE produit_id produit_id INT NOT NULL;
DROP INDEX fk_commande_client_has_produit_commande_client1_idx ON commande_client_vers_produit;
CREATE INDEX IDX_6E3497729E73363 ON commande_client_vers_produit (commande_client_id);
DROP INDEX fk_commande_client_has_produit_produit1_idx ON commande_client_vers_produit;
CREATE INDEX IDX_6E349772F347EFB ON commande_client_vers_produit (produit_id);
ALTER TABLE client CHANGE id id INT AUTO_INCREMENT NOT NULL;

### doctrine:schema:update --force

[Doctrine\DBAL\Exception\DriverException]
An exception occurred while executing 'ALTER TABLE categorie CHANGE id id TINYINT(1) NOT NULL':
SQLSTATE[HY000]: General error: 1025 Error on rename of './chezbio/#sql-1983_d2' to './chezbio/categorie' (errno: 150)

[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000]: General error: 1025 Error on rename of './chezbio/#sql-1983_d2' to './chezbio/categorie' (errno: 150)

[PDOException]
SQLSTATE[HY000]: General error: 1025 Error on rename of './chezbio/#sql-1983_d2' to './chezbio/categorie' (errno: 150)

为什么要进行所有这些更新?实际数据库在理论上是正确设计的。

问题最重要的部分:

(这可能与 Doctrine 无法与在线数据库同步的部分有关。)

我正在尝试从我的表格中选择几行。

例如,这里我尝试从 categorie 表中获取所有行:

$em->getRepository('AlembicBioBundle:Categorie')->findAll();

我在这个表中有 4 行:

mysql> SELECT * FROM categorie;
+----+----------+
| id | nom |
+----+----------+
| 1 | FROMAGES |
| 2 | PAINS |
| 3 | LEGUMES |
| 4 | VIANDES |
+----+----------+

当我使用 Doctrine 函数(而不是手动查询)时,我出现了 4 次“FROMAGES”行。 可能导致此问题的原因是什么?

最糟糕的是当我这样做的时候:

$em->getRepository('AlembicBioBundle:Categorie')->findOneByNom('PAINS');

它返回这些结果:

Alembic\BioBundle\Entity\Categorie Object
(
[nom:Alembic\BioBundle\Entity\Categorie:private] => PAINS
[id:Alembic\BioBundle\Entity\Categorie:private] => 1
)

PAINS 的 id 不应该是 1...

如果我尝试:$repo->findXXX(),我也会得到奇怪的输出。

优先级:我想找到一种方法让我的find()-based-methods 开始正常工作。数据库模式更新是次要问题...(如果这与 findXXX() 问题没有直接关系)。

最佳答案

前奏

修复您的映射元数据应该是您的最高优先事项。当映射元数据不正确或与数据库不同步时,可能会发生各种奇怪的事情。

我怀疑您描述的大部分问题都来自于学说使用了不正确的标识符属性定义这一事实。

修复映射元数据

命令 doctrine:mapping:import 将尝试基于现有数据库创建映射元数据。此过程是猜测,很可能不会产生 100% 正确的映射元数据。

重要的是手动检查映射元数据并更正需要更正的内容。请这样做。

我怀疑标识符属性(数据库中的 id 列)是使用“Doctrine 映射类型”boolean 映射的。这就是 doctrine:schema:update 命令将尝试将列类型更改为 TINYINT(1) 的原因之一。您可能想在此处使用 integer 类型。

您可以使用命令doctrine:schema:validate 来检查映射元数据是否正确并与数据库同步。

您也可能会遇到不容易解决的情况。并非所有数据库供应商的所有构造都由开箱即用的 Doctrine 支持。在许多情况下,它可以得到解决,但请提出一个专门针对该特定情况的新问题。

小建议

请不要使用改变映射元数据的命令/生成器,也不要使用实体。

在没有映射元数据(在项目开始时)时生成映射元数据很好,但我的经验表明,反复这样做以更改映射元数据(尤其是实体)会产生比它解决的问题更多的问题。

恕我直言,你应该从你的代码到你的数据库(而不是相反)。

关于mysql - Doctrine 总是返回相同的记录和模式 :update fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27345776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com