2016-03-16 3 views
5


Мы ретро-инжиниринг веб-приложения с использованием базы данных postgres. Мы хотим реорганизовать код, используя структуру symfony, но перед нами стоит проблема с использованием базы данных.Используйте базу данных postgres с symfony3


На данный момент наш проект работает с базой данных MySQL, используя ту же структуру для используемых таблиц. Проблема в том, что теперь нам нужно использовать базу данных postgresql, потому что есть много данных, и она, насколько нам известно, на самом деле не адаптирована к MySQL.


Мы провели много исследований, но нам не удалось создать базу данных postgresql в проекте symfony.
Сначала мы попытались применить этот урок: http://www.tutodidacte.com/symfony2-utiliser-une-base-de-donnee-postgresql мы адаптировали его как можно больше для нашего проекта. Вот наш config.yml

imports: 
    - { resource: parameters.yml } 
    - { resource: security.yml } 
    - { resource: services.yml } 

# Put parameters here that don't need to change on each machine where the app is deployed 
#  http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 
parameters: 
    locale: en 

framework: 
    #esi:    ~ 
    #translator:  { fallbacks: ["%locale%"] } 
    secret:   "%secret%" 
    router: 
     resource: "%kernel.root_dir%/config/routing.yml" 
     strict_requirements: ~ 
    form:   ~ 
    csrf_protection: ~ 
    validation:  { enable_annotations: true } 
    #serializer:  { enable_annotations: true } 
    templating: 
     engines: ['twig'] 
    default_locale: "%locale%" 
    trusted_hosts: ~ 
    trusted_proxies: ~ 
    session: 
     #  http://symfony.com/doc/current/reference/configuration/framework.html#handler-id 
     handler_id: session.handler.native_file 
     save_path:  "%kernel.root_dir%/../var/sessions/%kernel.environment%" 
    fragments:  ~ 
    http_method_override: true 
    assets: ~ 

# Twig Configuration 
twig: 
    debug:   "%kernel.debug%" 
    strict_variables: "%kernel.debug%" 

# Doctrine Configuration 
doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      #Mysql 
      default: 
       driver: pdo_mysql 
       host:  "%database_host%" 
       port:  "%database_port%" 
       dbname: "%database_name%" 
       user:  "%database_user%" 
       password: "%database_password%" 
       charset: UTF8 
      #Postgresql 
      pgsql: 
       driver: pdo_pgsql 
       host:  localhost 
       port:  5432 
       dbname: "%psql_database_name%" 
       user:  root 
       password: "%psql_database_password%" 
       charset: UTF8 

     #mapping_types: 
      #geometry: string 

    orm: 
     default_entity_manager: default 
     auto_generate_proxy_classes: "%kernel.debug%" 
     #naming_strategy: doctrine.orm.naming_strategy.underscore 
     #auto_mapping: true 

     entity_managers: 
      default: 
       connection: default 

       # lister les Bundles utilisant la connexion par defaut 

       #mappings: 
        #monprojetmysqlBundle: ~ 
        #tutoUserBundle: ~ 

      pgsql: 
       connection: pgsql # connection name for your additional DB 

       # bundles utilisant la connexion Postgresql 
       #mappings: 
        # PostgresqlBundle: ~ 

# Swiftmailer Configuration 
swiftmailer: 
    transport: "%mailer_transport%" 
    host:  "%mailer_host%" 
    username: "%mailer_user%" 
    password: "%mailer_password%" 
    spool:  { type: memory } 

но когда мы запустили эту команду: PHP бен/консольную доктрина: база данных: создать --connection = PgSQL мы имели этот ответ:

[Doctrine\DBAL\Exception\DriverException]    
    An exception occured in driver: could not find driver 



    [Doctrine\DBAL\Driver\PDOException] 
    could not find driver     



    [PDOException]   
    could not find driver 


doctrine:database:create [--connection [CONNECTION]] [--if-not-exists] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> 


Похоже, что у нас нет модуля pdo_pgsql, поэтому мы искали, как его установить.
Для этого мы применили сценарий, предложенный на этой странице github: https://gist.github.com/doole/8651341#file-install_psql_php-sh
Мы изменили версию postgres.app на 9.5. После нескольких попыток мы, наконец, получили pdo_pgsql на результат php -m.
Но знаете, у нас есть этот ответ, когда мы запускаем команду: PHP бен/консоли доктриной: База данных: создать --connection = PgSQL

PHP Warning: PHP Startup: pdo_pgsql: Unable to initialize module 
Module compiled with module API=20131226 
PHP compiled with module API=20121212 
These options need to match 
in Unknown on line 0 
PHP Warning: PHP Startup: pgsql: Unable to initialize module 
Module compiled with module API=20131226 
PHP compiled with module API=20121212 
These options need to match 
in Unknown on line 0 


    [Doctrine\DBAL\Exception\DriverException]    
    An exception occured in driver: could not find driver 



    [Doctrine\DBAL\Driver\PDOException] 
    could not find driver     



    [PDOException]   
    could not find driver 


doctrine:database:create [--connection [CONNECTION]] [--if-not-exists] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> 


Мы пытались сделать это: Install PHP with Postgresql on MAC using homebrew но Бесполезный Ничего изменить. Теперь у нас есть 5 PHP ПРЕДУПРЕЖДЕНИЯ для Pdo_Pgsql и PgSQL, когда мы запускаем команду PHP бен/консольную доктрина: базу данных: создать --connection = PgSQL


Мы также видели это: How to change a database to postgresql with Symfony 2.0? и это: How to create 2 connections (mysql and postgresql) with Doctrine2 in Symfony2 но это действительно не помогло, потому что первая касается debian, и мы работаем над OS X El Capitan, а вторая не говорила больше, чем предыдущий учебник.


Наконец, единственная надежда, что у нас есть, это то, что кто-то может нам помочь ... Спасибо заранее.

+0

Что говорит 'WARNING для pdo_pgsql'? Вы проверили, что вы правильно установили модуль pdo-pgsql (посмотрев на вывод 'phpinfo()», помните, что php-config может отличаться для CLI и Server)? – fateddy

+0

'PHP Предупреждение: PHP Startup: Pdo_Pgsql: Не удалось инициализировать модуль модуль собран с модулем API = 20131226 PHP скомпилирован с модулем API = 20121212 Эти параметры должны соответствовать в Unknown в строке 0 PHP Warning: PHP Startup: PgSQL : Не удалось инициализировать модуль Модуль, скомпилированный с модулем API = 20131226 PHP, скомпилированный с модулем API = 20121212 Эти параметры должны соответствовать в Unknown on line 0' – MarcoD

+1

Это все равно то же предупреждение, но у нас есть 5 раз. Я обнаружил, что со всей командой, которую я использовал, я переустанавливаю php, и теперь у меня есть 2 php.ini. Я попытаюсь полностью удалить все и переустановить php с помощью 'brew install php56 --with-postgresql' – MarcoD

ответ

3


Наконец, я исправил его, удалив все файлы, которые управляют php и переустанавливает php с помощью homebrew.


---- Удаление PHP ----
Во-первых, я использовал следующую команду из корня (cd /), чтобы найти все файлы, начинающиеся на "PHP"

find . -name "php*" 


В зависимости от результаты (у вас может быть много), удалите все файлы, которые нужно удалить (на данный момент это ваше мнение имеет значение). Например, я удалил файлы в/usr/local и/usr/bin, но не в/Applications или/Homebrew.
Примеры:

rm -Rf /usr/bin/php* 
rm -Rf /usr/local/php* 


Иногда, вы можете иметь «доступ запрещен» ошибка даже с Судом, но это не делает проблему в конце.


---- Переустановка PHP ----


После того, как все, что касается PHP удаляется, вы можете установить его заново, используя следующую командную строку:

brew install php56 --with-postgresql 

Если у вас есть «libz не найден», вам нужно будет запустить следующую команду:

xcode-select --install 

и повторно запустить установку с:

brew reinstall php56 --with-postgresql 

Если все прошло хорошо, вы будете иметь только определить поле date.timezone в php.ini, и вы будете иметь новую систему PHP. Вы можете проверить, что модуль pdo_pgsql установлен с использованием этой командной строки: php -m.


---- Подключение базы данных к вашему симфони проекта ----


Во-первых, вам нужно изменить приложение файл/Config/parameters.yml в проекте, добавив следующий код:

# Postgresl 
    psql_database_driver: pdo_pgsql 
    psql_database_host: 127.0.0.1 
    psql_database_port: 5432 
    psql_database_name: your_database_name 
    psql_database_user: your_user_name 
    psql_database_password: your_password 

Поля хоста и порта могут быть разными, но это два значения по умолчанию для symfony и базы данных postgres.


Тогда вы должны изменить файл приложения/Config/config.yml на уровне конфигурации Доктрина следующим образом:

# Doctrine Configuration 
doctrine: 
    dbal: 
     default_connection: pgsql 
     connections: 
      #Mysql 
      default: 
       driver: pdo_mysql 
       host:  "%database_host%" 
       port:  "%database_port%" 
       dbname: "%database_name%" 
       user:  "%database_user%" 
       password: "%database_password%" 
       charset: UTF8 
      #Postgresql 
      pgsql: 
       driver: pdo_pgsql 
       host:  "%psql_database_host%" 
       port:  "%psql_database_port%" 
       dbname: "%psql_database_name%" 
       user:  "%psql_database_user%" 
       password: "%psql_database_password%" 
       charset: UTF8 

     #mapping_types: 
      #geometry: string 

    orm: 
     auto_generate_proxy_classes: "%kernel.debug%" 
     naming_strategy: doctrine.orm.naming_strategy.underscore 
     auto_mapping: true 

Это пример можно адаптировать, как вы хотите.

Теперь вы можете подключить базу данных к вашему проекту с этой командной строкой:

php bin/console doctrine:database:create --connection=pgsql 

Если у вас уже есть объекты в вашем ЦСИ/AppBundle/Entity вы можете создавать свои таблицы с:

php bin/console doctrine:schema:update --force 


Все должно быть в порядке. Надеюсь, это поможет кому-то, кто сталкивается с такими проблемами.

Смежные вопросы