我需要什么
我需要连接oracle数据库和symfony2。
我已经通过php -m
进行了检查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%"]
答案 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 的数据泵。
答案 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
希望它有所帮助。