【问题标题】:Cannot connect database oracle with symfony2无法使用 symfony2 连接数据库 oracle
【发布时间】:2016-08-29 17:16:15
【问题描述】:

我需要什么

  • 我需要用symfony2连接oracle数据库。

  • 我已经通过 php -m 检查过

    • oci8
    • pdo_odbc

    • odbc

这是我关注的链接https://gist.github.com/johnkary/6481664

a.)config.yml

学说配置

 doctrine:
dbal:
    default_connection:   default
    connections:
        default:
            driver:   "%database_driver%"
            host:     "%database_host%"
            port:     "%database_port%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            charset:  "%database_charset%"

b.) 参数.yml

  # If connecting via SID
 parameters:
database_driver:   oci8
database_host:     abc
database_port:     '1521'
database_name:     test
database_user:     aa
database_password: aa
database_charset:  AL32UTF8
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: en
secret: zzzz

c.)services.orcale.yml

 services:
acme.doctrine.dbal.events.oracle_session_init.listener:
    class: %doctrine.dbal.events.oracle_session_init.class%
    tags:
        - { name: doctrine.event_listener, event: postConnect }
acme.doctrine.dbal.oracle_platform.type_mapping.listener:
    class: Acme\MisBundle\Listener\OracleDoctrineTypeMappingListener
    tags:
        - { name: doctrine.event_listener, event: postConnect }
  • 然后运行 ​​symfony 数据库 cmd

     php bin/console doctrine:database:create
    

错误:

 cannot create database test for connection named default.
 notice: undefined index dbname
  • 我用谷歌搜索了一天,但我认为很少有开发人员使用 symfony2 和 oracle。

  • 我制作了简单的 php 脚本来测试连接

    $userName = ""; $password = ""; $dtabasePort = "1521"; $serverName = "";
    
    $databaseName = "testingdb";
    $c = oci_connect($userName, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ) (SID =)))');
    
     print_r($c);
    

输出

       Resource id #3

tsnames.ora

    test=

       (DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = sss)(PORT = 1521))
          (CONNECT_DATA = (SID = test))
         )
  • 我曾使用过 sf3 和 mysql,但我是 oracle 新手,这就是为什么我不知道如何将 oracle db 与 symfony 连接。

  • 请在我做错的地方给出一些解决方案。

  • 任何人都可以分步建议如何将 oracle db 与 sf2/3 连接,非常感谢。

  • github 的链接依赖于我面临的相同问题 https://github.com/doctrine/dbal/issues/1564

    • 我也修改了 parameter.yml 文件

       parameters:
       database_driver: oci8
       database_user: <user>
       database_password: <password>
       database_charset: WE8MSWIN1252
       database_name: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service_name>)))
      

然后错误你请求了不存在的参数“database_host”

我尝试过的最后一个和最终的解决方案,但没有奏效,我认为 sf2 for oracle 中存在错误

    parameters:

        database_driver: oci8    
        database_host: 
        database_port: 1521
        database_name: 
        database_user: 
        database_password: 
        domain_name: 

     doctrine:
        dbal:
            default_connection:   default
            connections:
                default:
                    driver:   "%database_driver%"
                    host:     "%database_host%"
                    port:     "%database_port%"
                    dbname:   "%database_name%"
                    user:     "%database_user%"
                    password: "%database_password%"
                    charset:  UTF8
                    persistent: true
        orm:
            auto_generate_proxy_classes: "%kernel.debug%"
            auto_mapping: true
    services:
         pdo:
            class: PDO
            arguments:
                - "oci8:Server=%database_host%;Database=%database_name%"
                - "%database_user%"
                - "%database_password%"
            calls:
                - [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION

         session.handler.pdo:
            class:     ESERV\MAIN\FrameworkChanges\MtlPdoSessionHandler
            arguments: ["@pdo", "%pdo.db_options%"]   

【问题讨论】:

标签: php oracle symfony doctrine-orm


【解决方案1】:

这是我用来连接 MSSQL 的:https://github.com/realestateconz/MssqlBundle

config.yml:

doctrine:
dbal:
    types:
        string: ***\BacsManagementBundle\Type\StringType
    default_connection: default
    connections:
        default: 
            host:     "%database_host%"
            dbname:   "%database_name%"
            user:     "%database_user%"
            password: "%database_password%"
            driver_class:   Realestate\MssqlBundle\Driver\PDODblib\Driver
            mapping_types:
                enum: string
                string: string

希望对你有帮助。

【讨论】:

  • 我需要oracle数据库连接方面的帮助
  • 我需要连接 oracle 我认为必须有 oracle 誓言包装器才能连接服务器端语言
【解决方案2】:

这可能有点旧,但我认为它仍然有用。我正在开发一个连接到旧版 Oracle 11G 数据库的 Symfony 5 项目。在大多数情况下,Doctrine 运行良好。在某些情况下,您需要执行原始查询。

你的环境文件:

DATABASE_URL2="oci8://USERNAME:PASSWORD@HOSTNAME:1521/DATABASENAME"

注意:如果您使用的是 Oracle 11G Express Edition,您的数据库名称很可能是 XE

接下来更新您的学说.yaml 文件。就我而言,我有两个数据库。默认一个是 MySQL,第二个数据库是 Oracle 11G。安装 DoctrineExtensions 包也是一个好主意,它为 Doctrine 中的 Oracle 和 MySQL 提供了更多支持。

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                # configure these for your database server
                url: '%env(resolve:DATABASE_URL)%'
                driver: 'pdo_mysql'
                server_version: '5.7'
                charset: utf8mb4
                mapping_types:
                    enum: string
                default_table_options:
                    charset: utf8mb4
                    collate: utf8mb4_unicode_ci
            oracle:
                # configure these for your database server
                url: '%env(resolve:DATABASE_URL2)%'
                driver: 'oci8'
                server_version: '11'
                charset: AL32UTF8
    orm:
        auto_generate_proxy_classes: '%kernel.debug%'
        default_entity_manager: default
        entity_managers:
            default:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                connection: default
                auto_mapping: true
                dql:
                    numeric_functions:
                        rand: DoctrineExtensions\Query\Mysql\Rand
                    datetime_functions:
                        DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
                mappings:
                    App:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity'
                        prefix: 'App\Entity'
                        alias: App
            oracle:
                naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
                connection: oracle
                dql:
                    datetime_functions:
                        TO_CHAR: DoctrineExtensions\Query\Oracle\ToChar
                        TO_DATE: DoctrineExtensions\Query\Oracle\ToDate
                mappings:
                    Oracle:
                        is_bundle: false
                        type: annotation
                        dir: '%kernel.project_dir%/src/Entity/Oracle'
                        prefix: 'App\Entity\Oracle'
                        alias: Oracle

现在这就是棘手的地方。我的数据库没有任何主键,所以我必须手动将它们添加到每个表中才能导入实体。导入实体后,我会删除主键并手动更新实体。

php bin/console doctrine:mapping:import "App\Entity\Oracle" annotation --path=src/Entity/Oracle --em=oracle

您现在应该可以使用 Doctrine 来执行查询了。我喜欢使用存储库,所以我不使用查询生成器。

例子:

public function getEmployeeInfo($clientID)
{
    $sql =
      "
      SELECT
        p.employeeId,
        p.clientId,
        p.firstname,
        p.lastname
        
      FROM
        Oracle:Phoneext p
        
      WHERE
        p.clientId = :clientID
      
      ORDER BY p.lastname ASC
      "
    ;
    $query = $this->getEntityManager()->createQuery($sql);
    $query->setParameter('clientID', $clientID);
    $results = $query->getResult();
    return ($results);
}

如果您需要执行 RAW 查询:

public function getMultiStatusRowId($employeeID, $status, $date, $time, $em)
{
    $conn = $em->getConnection();

    $sql =
      "
      SELECT
        ROWIDTOCHAR(ROWID) as row_id
        
      FROM
        MULTI_STATUS
        
      WHERE
           EMPLOYEE_ID = ?
           AND  STATUS = ?
           AND IN_DATE = ?
           AND IN_TIME = ?
           
                   
      ORDER BY ORDER_NUM ASC  
      "
    ;

    $result = $conn->prepare($sql);
    $result->bindValue(1, $employeeID);
    $result->bindValue(2, $status);
    $result->bindValue(3, $date);
    $result->bindValue(4, $time);
    $result->execute();

    $data = array();
    $i = "0";
    while ($row = $result->fetch()) {
        $data[$i]['ROW_ID'] = $row['ROW_ID'];
        $i++;
    }
    return $data;
}

最后一项如果您需要帮助在 Mac 上设置本地系统,您可以使用它来帮助设置 Lando。注意我必须在 AWS EC2 上设置 Oracle 11G,然后才能使用 IMP 工具导入我的转储文件。

如果您设置 RDS,Amazon 将默认使用 Oracle 20 或更高版本。 AWS RDS 不支持来自 IMP 的旧备份。 RDS 将仅支持使用 S3 的数据泵。

https://github.com/rsaylor73/lando-apache-php-mysql-oci8

【讨论】:

  • 感谢您的回答,但我已经解决了问题非常感谢
猜你喜欢
  • 1970-01-01
  • 2019-10-18
  • 2020-01-02
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多