无法使用symfony2连接数据库oracle

时间:2016-05-04 10:17:12

标签: php oracle symfony doctrine-orm

我需要什么

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

  • 我已经通过php -m

    进行了检查
    • OCI8
    • PDO_ODBC

    • ODBC

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

的链接

一个。)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。)parameter.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

角)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 database cmd

     php bin/console doctrine:database:create
    

错误:

 cannot create database test for connection named default.
 notice: undefined index dbname
  • 我用Google搜索了一天,但我认为很少有开发人员使用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>)))
      

然后错误您已请求不存在参数&#34; database_host&#34;

最后&amp;最后的解决方案我试过但没有工作我认为在sf2中有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%"]   

2 个答案:

答案 0 :(得分:0)

这可能有点旧,但我认为它仍然有用。我正在处理连接到旧版 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

答案 1 :(得分:-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
希望它有所帮助。