Data-fixtures: μ™Έλž˜ ν‚€κ°€ μžˆλŠ” ν…Œμ΄λΈ” 자λ₯΄κΈ° μ‹€νŒ¨

에 λ§Œλ“  2011λ…„ 06μ›” 12일  Β·  25μ½”λ©˜νŠΈ  Β·  좜처: doctrine/data-fixtures

symfony CLI λͺ…령을 ν˜ΈμΆœν•  λ•Œ:

php app/console doctrine:fixtures:load

λ‚˜λŠ” μ–»λ‹€

[PDOException] 

SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint (symfony.param_product, CONSTRAINT param_product_ibfk_1 FOREIGN KEY (param_val_id) REFERENCES symfony.param_value (id))

symfony.param_product ν…Œμ΄λΈ”μ€ @ORM\JoinTable 주석(@ORM\ManyToMany 포함)에 μ˜ν•΄ μƒμ„±λ©λ‹ˆλ‹€. λ‚˜λŠ” MySQL을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€

이것은 이 λ³€κ²½ 전에 잘 μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€: 91ff6ebbb781441c60782d90a4dd95482eeedf35

λ‚΄ μͺ½μ˜ 버그일 수 μžˆλ‹€κ³  μƒκ°ν–ˆμ§€λ§Œ(예: onDelete μ˜΅μ…˜ μ—†μŒ) μ‹œλ„ν•œ λͺ¨λ“  것이 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ 예λ₯Ό λ“€μ–΄ http://forums.asp.net/t/1283840.aspx/1?How+can+I+truncate+the+table+which+have+foreign+key+ μ—μ„œ 배운 ν•œ

 ON DELETE CASCADE is true only for deleting records and not for truncating tables.

 You have to drop the foreign key constraint from Child Table that references the Master Table to be truncated, then after only you are able to truncate the Master Table. 

λ”°λΌμ„œ μœ μΌν•œ 해결책은 DELETEλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ λ¨Όμ € μ•žμ˜ ν‚€λ₯Ό μ‚­μ œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 91ff6ebbb781441c60782d90a4dd95482eeedf35 λ³€κ²½ 사항을 되돌릴 수 μžˆμŠ΅λ‹ˆκΉŒ? @λ² λ² λ₯Όλ ˆμ΄?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ‹€μŒμ€ MySQL 5.5μ—μ„œ μž‘λ™ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•œ λΉ λ₯Έ λ”λŸ¬μš΄ ν•΄ν‚Ήμž…λ‹ˆλ‹€.

diff --git a/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php b/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
index a580c1f..ff758c1 100644
--- a/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
+++ b/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
@@ -82,10 +82,12 @@ class ORMPurger implements PurgerInterface
             $orderedTables[] = $class->getTableName();
         }

+       $this->em->getConnection()->executeUpdate("SET foreign_key_checks = 0;");
         $platform = $this->em->getConnection()->getDatabasePlatform();
         foreach($orderedTables as $tbl) {
             $this->em->getConnection()->executeUpdate($platform->getTruncateTableSQL($tbl, true));
         }
+       $this->em->getConnection()->executeUpdate("SET foreign_key_checks = 1;");
     }

     private function getCommitOrder(EntityManager $em, array $classes)

λͺ¨λ“  25 λŒ“κΈ€

DELETE λ₯Ό μ‚¬μš©ν•  λ•Œμ˜ λ¬Έμ œλŠ” μžλ™ 증가 값을 μž¬μ„€μ •ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ’‹μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ TRUNCATE 의 λ¬Έμ œλŠ” ꡐ리: κ³ μ • μž₯치 :load λͺ…령이 μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

정말 ν•„μš”ν•œ 경우, 예λ₯Ό λ“€μ–΄ ν…Œμ΄λΈ”μ„ μ‚­μ œν•˜κ³  λ‹€μ‹œ λ§Œλ“œλŠ” 것과 같이 μžλ™ 증뢄을 1μ—μ„œ μ‹œμž‘ν•˜λŠ” 것은 항상 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡μ£ ?

예 - λ‚˜λ„μ΄ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ§€κΈˆμ€ 91ff6ebbb781441c60782d90a4dd95482eeedf35둜 λ‘€λ°±ν•©λ‹ˆλ‹€.

91ff6ebbb781441c60782d90a4dd95482eeedf35 되돌리기 +1

TRUNCATE에 'CASCADE'λ₯Ό μΆ”κ°€ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? $platform->getTruncateTableSQL($tbl)μ—λŠ” 'TRUNCATE table CASCADE'(적어도 postgres의 경우)와 같은 것을 λ°˜ν™˜ν•˜λŠ” 두 번째 λ§€κ°œλ³€μˆ˜κ°€ 있으며 μž‘λ™ν•©λ‹ˆλ‹€.

ν’€ λ¦¬ν€˜μŠ€νŠΈλ₯Ό μΆ”κ°€ν•˜λŠ” 것은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ? 그러면 병합할 수 μžˆμŠ΅λ‹ˆλ‹€.

@leahaense

λ¬Έμ œλŠ” MySQL을 μ‚¬μš©ν•  λ•Œ μ—¬μ „νžˆ μ‘΄μž¬ν•©λ‹ˆλ‹€(4a8464ef83093de2378cef2770e13da7e4858ffc 이후에도).

이 경우 μ™Έλž˜ ν‚€κ°€ μ–‘λ°©ν–₯μž…λ‹ˆκΉŒ?

@beberlei λ„€ κ·Έλ ‡κ²Œ μƒκ°ν•©λ‹ˆλ‹€. SQL이 μΌλŒ€λ‹€/λ‹€λŒ€λ‹€ 주석(예: μ–‘λ°©ν–₯)μ—μ„œ Doctrine에 μ˜ν•΄ μƒμ„±λ˜κΈ° λ•Œλ¬Έμ— 100% ν™•μ‹ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ μ‚¬λžŒμ΄ MySQLμ—μ„œ 이 문제λ₯Ό κ²ͺκ³  μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ μ €λ§Œ κ·ΈλŸ°κ°€μš”?

TRUNCATE 전에 foreign_key_checks=0 을 μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

http://bugs.mysql.com/bug.php?id=58788

λ‚˜λŠ” λ˜ν•œμ΄ 문제λ₯Ό μΉ˜κ³ μžˆλ‹€.

λ‚˜λŠ” λ‚΄ νŒŒνŠΈλ„ˆμ™€ λ˜‘κ°™μ€ 문제둜 μ‹€ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. 이것은 MySQL 5.5μ—μ„œ λ°œμƒν•˜μ§€λ§Œ 5.1은 μ™Έλž˜ ν‚€λ‘œ ν…Œμ΄λΈ”μ„ 자λ₯΄λŠ” 데 λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€. DELETE둜 λ˜λŒλ¦¬λŠ” 것은 auto_increment ν‚€κ°€ μž¬μ„€μ •λ˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μ•žμ—μ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ μš°μ•„ν•œ μ†”λ£¨μ…˜μ΄ μ•„λ‹™λ‹ˆλ‹€.

mysql 5.5에 λŒ€ν•΄ foreign_key_checks=0κ³Ό 같은 μˆ˜μ • 사항이 있으면 쒋을 κ²ƒμž…λ‹ˆλ‹€.

http://bugs.mysql.com/bug.php?id=54678

λ‹€μŒμ€ MySQL 5.5μ—μ„œ μž‘λ™ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•œ λΉ λ₯Έ λ”λŸ¬μš΄ ν•΄ν‚Ήμž…λ‹ˆλ‹€.

diff --git a/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php b/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
index a580c1f..ff758c1 100644
--- a/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
+++ b/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
@@ -82,10 +82,12 @@ class ORMPurger implements PurgerInterface
             $orderedTables[] = $class->getTableName();
         }

+       $this->em->getConnection()->executeUpdate("SET foreign_key_checks = 0;");
         $platform = $this->em->getConnection()->getDatabasePlatform();
         foreach($orderedTables as $tbl) {
             $this->em->getConnection()->executeUpdate($platform->getTruncateTableSQL($tbl, true));
         }
+       $this->em->getConnection()->executeUpdate("SET foreign_key_checks = 1;");
     }

     private function getCommitOrder(EntityManager $em, array $classes)

μœ„μ˜ μˆ˜μ • 사항은 μ €μ—κ²Œ νš¨κ³Όμ μž…λ‹ˆλ‹€. 항상 μˆ˜λ™μœΌλ‘œ λ³€κ²½ν•  ν•„μš”κ°€ 없도둝 repo에 μˆ˜μ • 사항을 λ„μž…ν•  수 μžˆλŠ” 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ?

λ˜ν•œ λ²ˆλ“€μ„ μ‚¬μš©ν•˜λ €λ©΄ 이 μˆ˜μ • 사항을 μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

μœ„μ˜ λ‚΄μš©μ€ λ‚˜λ₯Ό μœ„ν•΄ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€(λ‚΄κ°€ 말할 수 μžˆλŠ” ν•œ, μ—¬μ „νžˆ Doctrine/Symfony2λ₯Ό 배우고 있음)

λ‚΄κ°€ λ§Œλ“  foreign_key_checks @mdarse 그의 ν’€ μš”μ²­μ„ 제좜 μžμ²΄κ°€ λͺ‡ λΆ„ 후에 DBAL ν”„λ‘œμ νŠΈμ— MySqlPlatform을 λ³€κ²½ :

https://github.com/doctrine/dbal/pull/42

λ‚΄ μ»΄ν“¨ν„°μ—μ„œ MySQL 5.5.9와 같은 λ¬Έμ œκ°€ λ°œμƒν–ˆμ§€λ§Œ dogbrain의 해킹이 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

이 μˆ˜μ • 사항을 톡합할 수 μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•ŠμœΌλ©΄ λͺ¨λ“  μ‚¬λžŒμ΄ 항상 μˆ˜λ™μœΌλ‘œ μΆ”κ°€ν•΄μ•Ό μž‘λ™ν•©λ‹ˆλ‹€.

"μˆ˜μ •"이 μ•„λ‹ˆλΌ ν•΄ν‚Ήμž…λ‹ˆλ‹€. λ‚˜λŠ” 해킹을 λ³‘ν•©ν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

μ’‹μ•„... μΆ©λΆ„νžˆ 곡정해. κ·ΈλŸ¬λ‚˜ κ³ μ • μž₯μΉ˜κ°€ μž‘λ™ν•˜λ„λ‘ ν—ˆμš©ν•˜λŠ” 해킹이며 μž‘λ™ν•˜λ©΄ 쒋을 κ²ƒμž…λ‹ˆλ‹€ ;)
병합할 수 μ—†λŠ” 경우 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆκΉŒ? 그렇지 μ•ŠμœΌλ©΄ λ§Žμ€ μ‚¬λžŒλ“€μ΄ 이 λ²ˆλ“€μ„ μ‚¬μš©ν•  수 μ—†κ²Œ λ§Œλ“œλŠ” 버그가 μžˆμŠ΅λ‹ˆλ‹€(μ—…λ°μ΄νŠΈκ°€ λ§Œλ“€μ–΄μ§ˆ λ•Œλ§ˆλ‹€ μ½”λ“œλ₯Ό μ§€μ†μ μœΌλ‘œ μˆ˜λ™μœΌλ‘œ ν•΄ν‚Ήν•˜μ§€ μ•Šκ³ ).

@λ² λ² λ₯Όλ ˆμ΄?

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 91ff6eb 변경을 되돌릴 수 μžˆμŠ΅λ‹ˆκΉŒ?

μ΄λ ‡κ²Œν•˜λ©΄ ν•΄ν‚Ήμ΄λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이 문제의 첫 번째 κ²Œμ‹œλ¬Όμ—μ„œ μ œμ•ˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ μ œλŒ€λ‘œν•˜κ³  μžˆλŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šμ§€λ§Œ 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš© 쀑인 버전을 μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. Composer둜 λ‹€μš΄λ‘œλ“œν–ˆμŠ΅λ‹ˆλ‹€.

"require": {
    "doctrine/doctrine-fixtures-bundle": "dev-master"
},

μ–΄μ¨Œλ“  인덱슀 μž¬μ„€μ •μ„ μ–»μœΌλ €λ©΄ λ‹€μ‹œ λ‘œλ“œν•˜κΈ° 전에 " ꡐ리:μŠ€ν‚€λ§ˆ :drop --force"λ₯Ό μ‹€ν–‰ν•œ λ‹€μŒ " ꡐ리:μŠ€ν‚€λ§ˆ :update --force"λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ 같은 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. λˆ„κ΅°κ°€ λ‚΄κ°€ 뭘 잘λͺ»ν•˜κ³  μžˆλŠ”μ§€ 말해 쀄 수 μžˆμŠ΅λ‹ˆκΉŒ?
미리 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

μ΅œμ‹  λ²„μ „μ˜ ꡐ리 κ³ μ • μž₯μΉ˜μ™€ Mysql 5.5λ₯Ό μ‹€ν–‰ν•˜λŠ” 것과 λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. "ν•΄ν‚Ή"이 μž‘λ™ν–ˆμ§€λ§Œ 이식 κ°€λŠ₯ν•œ μ†”λ£¨μ…˜μ΄ μ•„λ‹™λ‹ˆλ‹€. μŠ€ν‚€λ§ˆλ₯Ό μ‚­μ œν•˜κ³  맀번 λ‹€μ‹œ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μžμ‹ μ—κ²Œ 호의λ₯Ό λ² ν’€κ³  load_fixtures 와 같이 Symfony 폴더 μ•ˆμ— 슀크립트λ₯Ό λ§Œλ“œμ‹­μ‹œμ˜€.

bin/console doc:sc:drop --force
bin/console doc:sc:cr
bin/console doc:fix:lo --no-interaction

chmod 755 load_fixtures λ₯Ό μ‹€ν–‰ν•œ λ‹€μŒ ./load_fixtures.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰