postgresql 在 symfony3 中使用 postgres 数据库
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36030961/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Use a postgres database with symfony3
提问by MarcoD
We are retro-engineering a web application using a postgres database. We want to refactor the code using the symfony framework but we are facing a problem to use the database with it.
我们正在使用 postgres 数据库对 Web 应用程序进行逆向工程。我们想使用 symfony 框架重构代码,但我们面临着使用数据库的问题。
For the moment our project is working with a MySQL database just using the same structure for the used tables. The problem is that, now, we need to use the postgresql database because there is a lot of data and it's not really adapted to MySQL as far as we know.
目前我们的项目正在使用 MySQL 数据库,只是对使用过的表使用相同的结构。问题是,现在我们需要使用 postgresql 数据库,因为有很多数据,据我们所知,它并没有真正适应 MySQL。
We made a lot of research but we didn't succeed to create a postgresql database in the symfony project.
First, we tried to apply this tutorial : http://www.tutodidacte.com/symfony2-utiliser-une-base-de-donnee-postgresqlwe adapted it as much as possible for our project.
Here is our config.yml
我们做了很多研究,但没有成功在symfony项目中创建postgresql数据库。
首先,我们尝试应用本教程: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 }
but when we launched this command : php bin/console doctrine:database:create --connection=pgsqlwe had this answer :
但是当我们启动这个命令时:php bin/console algorithm:database:create --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>
It seems that we don't have the module pdo_pgsqlso we searched how to install it.
To do it, we applied the script proposed on this github page : https://gist.github.com/doole/8651341#file-install_psql_php-sh
We changed the version of postgres.app to 9.5.
After a few tries, we finally succeeded to have pdo_pgsqlon the result of php -m.
But know, we have this answer when we launch the command : php bin/console doctrine:database:create --connection=pgsql
似乎我们没有模块pdo_pgsql所以我们搜索了如何安装它。
为此,我们应用了这个 github 页面上提出的脚本:https: //gist.github.com/doole/8651341#file-install_psql_php-sh
我们将 postgres.app 的版本更改为 9.5。经过几次尝试,我们终于成功地 对php -m的结果进行了pdo_pgsql。
但是要知道,当我们启动命令时,我们有这个答案:php bin/console police:database:create --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>
We tried to do this : Install PHP with Postgresql on MAC using homebrewbut it didn't change anything. Now we have 5 PHP WARNING for pdo_pgsql and pgsql when we launch the command php bin/console doctrine:database:create --connection=pgsql
我们尝试这样做:使用自制软件在 MAC 上安装带有 Postgresql 的 PHP,但它没有改变任何东西。现在,当我们启动命令php bin/console police:database:create --connection=pgsql时,我们有 5 个针对 pdo_pgsql 和 pgsql 的 PHP 警告
We have also seen this :
How to change a database to postgresql with Symfony 2.0?and this : How to create 2 connections (mysql and postgresql) with Doctrine2 in Symfony2but it didn't really help because the first one concern debian and we are working on OS X El Capitan and the second one don't tell more than the previous tutorial.
我们也看到了这一点:
如何使用 Symfony 2.0 将数据库更改为 postgresql?和这个:如何在 Symfony2 中使用 Doctrine2 创建 2 个连接(mysql 和 postgresql),但它并没有真正帮助,因为第一个与 debian 相关,我们正在开发 OS X El Capitan,而第二个并没有告诉更多之前的教程。
Finally, the only hope we have is that someone can help us...
Thank you in advance.
最后,我们唯一的希望是有人可以帮助我们...在此先感谢您。
回答by MarcoD
Finally, I fixed it by removing all the files that manage php and reinstalling php with homebrew.
最后,我通过删除所有管理 php 的文件并使用自制软件重新安装 php 来修复它。
---- Removing php ----
First, I used the following command from root (cd /) to find all the files starting by "php"
---- 删除 php ----
首先,我从 root ( cd /)使用以下命令查找所有以“php”开头的文件
find . -name "php*"
Depending on the results (you might have a lot), remove all the files that need to be removed (at this point it's your judgement that matter). For example, I removed files in /usr/local and /usr/bin but not in /Applications or /Homebrew.
Examples :
根据结果(您可能有很多),删除所有需要删除的文件(此时重要的是您的判断)。例如,我删除了 /usr/local 和 /usr/bin 中的文件,但没有删除 /Applications 或 /Homebrew 中的文件。
例子 :
rm -Rf /usr/bin/php*
rm -Rf /usr/local/php*
Sometimes, you can have a "permission denied" error even with sudo but it didn't make problem at the end.
有时,即使使用 sudo 也可能出现“权限被拒绝”错误,但最终没有出现问题。
---- Reinstalling php ----
---- 重新安装php ----
Once everything concerning php is removed, you can reinstall it using the following command line :
删除有关 php 的所有内容后,您可以使用以下命令行重新安装它:
brew install php56 --with-postgresql
If you have a "libz not found" error, you will need to launch the following command :
如果出现“找不到 libz”错误,则需要启动以下命令:
xcode-select --install
and relaunch the installation with :
并使用以下命令重新启动安装:
brew reinstall php56 --with-postgresql
If everything went well, you will only have to define the field date.timezonein php.ini and you will have new php system. You can check that you have the pdo_pgsql module installed using this commande line : php -m.
如果一切顺利,您只需date.timezone在 php.ini 中定义该字段,您将拥有新的 php 系统。您可以检查您在使用本COMMANDE线安装pdo_pgsql模块:php -m。
---- Connect your database to your symfony project ----
---- 将您的数据库连接到您的 symfony 项目 ----
First, you need to modify the file app/config/parameters.yml in your project by adding the following code :
首先,您需要通过添加以下代码来修改项目中的文件 app/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
The fields host and port can be different but this two are the default values for symfony and a postgres database.
字段主机和端口可以不同,但这两个是 symfony 和 postgres 数据库的默认值。
Then, you will have to modify the file app/config/config.yml at the Doctrine Configuration level this way :
然后,您必须以这种方式在 Doctrine 配置级别修改文件 app/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
This is an example you can adapt as you wish.
这是一个示例,您可以根据需要进行调整。
Now, you can connect your database to your project with this command line :
现在,您可以使用以下命令行将数据库连接到您的项目:
php bin/console doctrine:database:create --connection=pgsql
If you already have entities in your src/AppBundle/Entity you can create your tables with :
如果您的 src/AppBundle/Entity 中已经有实体,您可以使用以下命令创建表:
php bin/console doctrine:schema:update --force
Everything must be alright now. I hope, it will help someone else who faces this kind of problems.
现在一切都应该好了。我希望,它会帮助面临此类问题的其他人。

