2011-07-27 10 views
5

के साथ doctrine2 का उपयोग करके एकाधिक डेटाबेस माइग्रेट करना मेरे पास symfony2 + doctrine2 में 2 डेटाबेस db1 और db2 हैं और दोनों डेटाबेस टेबल और उनके फ़ील्ड के मामले में एक-दूसरे से अलग हैं। मुझे माइग्रेशन पर काम करने की आवश्यकता है। जब तक एक डेटाबेस होता है तब तक चीजें ठीक काम करती हैं। लेकिन यह एक से अधिक डेटाबेस होने पर काम नहीं करता है।Symfony2

इसके अलावा, कोई तरीका है जहां मैं इकाई प्रबंधक विशिष्ट माइग्रेशन सेटिंग्स प्रदान कर सकता हूं। या कोई तरीका है जिसके माध्यम से मैं माइग्रेशन क्लास में कनेक्शन या इकाई प्रबंधक प्रदान कर सकता हूं।

कृपया मदद करें।

धन्यवाद ..

उत्तर

9

आप स्थानांतरण कार्य में --em = का उपयोग कर नाम विकल्प एक entityManager प्रदान कर सकते हैं। मैं भी कोड के इस टुकड़े जोड़ने के लिए, गलती से एक और डाटाबेस पर प्रवास के क्रियान्वित करने से बचने के लिए:

$parameters = $this->connection->getParams(); 
    $this->skipIf(
     $parameters['dbname'] != "my_db_name" 
     'This is the other DB\'s migration, pass a correct --em parameter' 
    ); 

मैं ईएम जाँच करने के लिए किसी अन्य तरीके से नहीं मिला है, इसलिए यदि आपके डेटाबेस मैं तुम्हें मदद नहीं कर सकता समान नाम हैं

यह भी ध्यान दें कि आपको अपने सभी माइग्रेशन में skip जोड़ना चाहिए, ताकि आप दोनों डेटाबेस में चिंता किए बिना माइग्रेट कर सकें।

+1

समस्या सिर्फ मैं इस दृष्टिकोण के साथ पाया गया कि आप एक से अधिक जोड़ने के लिए अगर आप विकास, परीक्षण, मचान और उत्पादन पर अलग db नाम का उपयोग है शर्तेँ। अगर हम इकाई प्रबंधक पैरामीटर तक पहुंच सकते हैं तो यह आसान होगा। – Sergi

0

समान समस्या और समाधान: Symfony2 - Change Migration Directory

आप दूसरे DB के लिए अन्य माइग्रेशन फ़ोल्डर बनाने और अंदर माइग्रेशन डाल सकते हैं।

1

यह प्रश्न थोड़ा पुराना है, लेकिन यह पहली बार आया जब मैं वही बात पूछ रहा था। मुझे अपना जवाब Doctrine migrations configuration docs में मिला। मान लीजिए कि आप दो डेटाबेस के लिए कनेक्शन, अपने स्वयं के इकाई प्रबंधकों के साथ प्रत्येक (एक्सएमएल, एनोटेशन नहीं है, और नहीं ऑटो मैप किया तो स्कीमा कॉन्फ़िगरेशन ही config/doctrine पथ में रह सकते हैं के साथ यहाँ मैप किया गया है) करते हैं:

# config.yml 
doctrine: 
dbal: 
    default_connection: default 
    connections: 
     default: 
      driver: '%database_driver%' 
      ... 
     special: 
      driver: '%special_database_driver%' 
orm: 
    entity_managers: 
     default: 
      auto_mapping: false 
      mappings: 
       base: 
        type: xml 
        dir: '%kernel.root_dir%/../src/MyBundle/Resources/config/doctrine/base' 
        prefix: MyBundle\Entity 
        alias: Base 
        is_bundle: false 
     special: 
      auto_mapping: false 
      connection: special 
      mappings: 
       special: 
        type: xml 
        dir: '%kernel.root_dir%/../src/MyBundle/Resources/config/doctrine/special' 
        prefix: MyBundle\Special 
        alias: Special 
        is_bundle: false 

तो फिर तुम config.yml में कॉन्फ़िगरेशन शामिल नहीं है। तब

# src/MyBundle/Resources/config/migrations/base.yml 
name: BaseMigrations 
migrations_namespace: MyBundle\Migrations\Base 
table_name: Migrations 
migrations_directory: src/MyBundle/Migrations/Base 

# src/MyBundle/Resources/config/migrations/special.yml 
name: SpecialMigrations 
migrations_namespace: MyBundle\Migrations\Special 
table_name: Migrations 
migrations_directory: src/MyBundle/Migrations/Special 

, जब भी आप किसी भी प्रवास आदेश चला, दोनों इकाई प्रबंधक और विन्यास निर्दिष्ट करें:: इसके बजाय, हर एक के लिए एक विन्यास फाइल बनाने

bin/console doctrine:migrations:status --env=dev --em=special --configuration=src/MyBundle/Resources/config/migrations/special.yml 

यह अगर हाथ से चल रहा है याद करने के लिए एक सा , ताकि आप जीवन को आसान बनाने के लिए उन्हें अपने स्वयं के आदेश में लपेटना चाहें (उदाहरण के लिए bin/console my:migrations:status --env=dev --db=special जैसे कुछ)। यह भी कोई मुद्दा नहीं है अगर आप एक तैनाती बैश स्क्रिप्ट है, जैसे:

#!/bin/bash 
ENVIRONMENT="$1" 

# Run migrations for a configuration 
function runMigrations() 
{ 
    local CONFIG="$1" 
    local MANAGER="$2" 
    local STATUS="$(bin/console doctrine:migrations:status --env=${ENVIRONMENT} --configuration=${CONFIG} --em=${MANAGER})" 

    case "${STATUS}" in 
     *"Already at latest version"*) 
      # Do nothing 
      ;; 
     *) 
      runNextMigration $CONFIG $MANAGER 
      ;; 
    esac 
} 

# Run the next migration for a configuration 
function runNextMigration() 
{ 
    local CONFIG="$1" 
    local MANAGER="$2" 
    bin/console doctrine:migrations:migrate next --env=$ENVIRONMENT --configuration=$CONFIG --em=$MANAGER 

    runMigrations $CONFIG $MANAGER 
} 

runMigrations "src/MyBundle/Resources/config/migrations/base.yml" "default" 
runMigrations "src/MyBundle/Resources/config/migrations/special.yml" "special"