我有一个这样的基本代码集(在控制器内):
$sql = 'select * from someLargeTable limit 1000';
$em = $this->getDoctrine()->getManager();
$conn = $em->getConnection();
$statement = $conn->prepare($sql);
$statement->execute();
Run Code Online (Sandbox Code Playgroud)
我的困难在于,当结果集只有几条记录时,内存使用情况并没有那么糟糕.我在运行$ statement-> execute()之前和之后回显了一些调试信息.部分代码,并为我的实现找到了我有以下内容:
pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 1000 memory: 50.917 MB
Run Code Online (Sandbox Code Playgroud)
将其从1000条记录中移动到10k时,MB使用率的差异将增加到13 MB
pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 10000 memory: 62.521 MB
Run Code Online (Sandbox Code Playgroud)
最终,检索大约50k记录,我接近我的最大内存分配:
pre-execute... rowCount :: 0 memory: 49.614 MB
post-execute... rowCount :: 50000 memory: 114.096 MB
Run Code Online (Sandbox Code Playgroud)
通过这种实现,我无法编写一个允许我检索数据CSV的控制器(甚至命令).当然,50k +条目听起来很多,问题就是为什么,但这不是问题.
我的最终问题是:在执行时,是否可以告诉DBAL/Connection或DBAL/Statement缓冲SQL内部的数据而不是整个PHP中的数据.例如,如果我有1000万行,只发送第一个说10k行到PHP ...让我通过@ statement-> fetch(); 当光标到达10k的末尾时,截断数组并从数据库中获取下一个10k?
我正在尝试将"enum"类型添加到我的symfony2 dbal连接中,但我无法找到方法.
doctrine:
dbal:
mapping_types:
enum: string
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
connection2:
driver: "%database2_driver%"
host: "%database2_host%"
port: "%database2_port%"
dbname: "%database2_name%"
user: "%database2_user%"
password: "%database2_password%"
charset: LATIN1
Run Code Online (Sandbox Code Playgroud)
这是我的配置,我收到错误:
[Symfony\Component\Config\Definition\Exception\InvalidConfigurationException]
Unrecognized option "mapping_types" under "doctrine.dbal"
Run Code Online (Sandbox Code Playgroud)
我也尝试将它放在connection2下面并删除了default_connection,因为我找到了解决这个问题的答案.但这些问题没有多重联系.
是否可以将REST API用作Doctrine数据库?
关于http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/configuration.html上的配置,我可以更改“ driver”属性。
但是在允许的驱动程序列表中,没有人可以使用REST API。
我想做的是:
<?php
$config = new \Doctrine\DBAL\Configuration();
//..
$connectionParams = array(
'dbname' => 'my_rest_api',
'user' => 'user',
'password' => 'secret',
'host' => 'localhost:3000',
'driver' => 'rest',
);
$conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config);
$entityManager = EntityManager::create($conn, $config);
// Sends a GET request to localhost:3000/myentity/1 and maps it properly to my configured entity
$entity = $entityManager->find("MyNamespace\Entity\MyEntity", 1);
// Sends a POST request to localhost:3000/myentity
$entity = new MyEntity();
$entityManager->persist($entity);
$entityManager->flush();
// and so on
Run Code Online (Sandbox Code Playgroud)
谢谢您的回答!!
DBAL查询生成器:http : //www.doctrine-project.org/api/dbal/2.3/class-Doctrine.DBAL.Query.QueryBuilder.html
ORM查询生成器:http : //www.doctrine-project.org/api/orm/2.3/class-Doctrine.ORM.QueryBuilder.html
在Doctrine中,有两个非常相似的QueryBuilder,一个是DBAL,另一个是ORM。
那两个有什么区别?与DBAL相比,使用ORM queryBuilder是否有很大的开销?
(本地查询是毫无疑问的,因为我需要使用动态where语句)
我得到一个错误,当我尝试列的类型从字符串文本,随着Laravel的迁移功能。
文件:{data_time} _change_db_structure.php
public function up()
{
Schema::table('service_request_type', function (Blueprint $table) {
$table->dropIndex(['sro_key_group']);
$table->text('sro_key_group')->change();
$table->renameColumn('sro_key_group', 'tags');
});
}
Run Code Online (Sandbox Code Playgroud)
这是原单迁移创建表文件。
public function up()
{
Schema::create('service_request_type', function (Blueprint $table) {
$table->engine = 'InnoDB';
...
$table->string('sro_key_group', 100)->nullable()->index();
...
});
}
Run Code Online (Sandbox Code Playgroud)
我弄错了。
[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'sro_key_group' used in key specification without a key length (SQL: ALTER TABLE service_request_type CHANGE sro_key_group sro _key_group TEXT DEFAULT NULL COLLATE utf8_unicode_ci)Run Code Online (Sandbox Code Playgroud)[Doctrine\DBAL\Driver\PDOException]SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column …
我正在使用 Doctrine 2,其中我有多个 DBAL 连接。我在 ORM 中也有多个 EntityManager。
我需要能够以某种方式将特定的 DBAL 连接自动连接到其他 Symfony 3 服务中。
我可以使用 EntityManagerDecorator 自动装配任何 EntitiyManager 但不知道如何对连接执行相同的操作。我能够从 EntityManager 获得连接,但我认为这不是可行的方法。
我已经用这个问题抓了几个小时......这就是发生的事情:
我运行这个声明
SELECT STATUS FROM [dbo].[TMP_TEST_CALL_LIST]其中identity ='659303186000000000'
我得到以下结果(单行):
'Y'
然后我运行这个声明
更新[dbo].[TMP_TEST_CALL_LIST]设置状态='Z',其中identity ='659303186000000000'
我得到了这个!!!:
(1排受影响)
(1排受影响)
好像有2个语句已被执行!
但它变得更糟......即使我像这样运行它:
更新[dbo].[TMP_TEST_CALL_LIST]设置状态='Z',其中identity ='659303186000000000'AND status ='Y'
它会给我同样的"双重"结果.如果我使用与任何记录不匹配的WHERE子句运行它,它将告诉我0行受影响...两次.
(甚至更多)令人毛骨悚然的事情是,这发生在数据库中的某些表中,而不是其他表.我无法弄清楚表之间的区别是什么.
救命 !!!
谢谢.
注意:这是SQL Server 2008 R2
遵循Doctrine DBAL文档,我应该能够绑定一个字符串值列表,如下所示:
$sql = 'SELECT * FROM mytable WHERE myfield IN (?)';
$stmt = $conn->prepare($sql);
$stmt->bindValue('myfield', array('stringa', 'stringb', 'stringc'), \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
这导致PHP通知并杀死我的脚本.
Notice: Array to string conversion in C:\www\eurocampings\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php on line 142
Run Code Online (Sandbox Code Playgroud)
我做错什么了吗?
我想请求您帮助Doctrine2 DBAL使用QueryBuilder. 我习惯了 ORM,但我认为对于在侦听器中调用的此类查询来说,这是一种矫枉过正的做法。
我需要一个查询SELECT EXISTS,但我不知道如何使用 DBAL 构造它QueryBuilder。
我已经创建了一个子查询:
$subQuery = $connection->createQueryBuilder();
$subQuery
->select('o.id')
->from('order', 'o')
->leftJoin('o', 'payment', 'p')
->where($subQuery->expr()->isNull('p.id'))
;
Run Code Online (Sandbox Code Playgroud)
我主要是想检查是否有未付款的订单。我现在不知道如何构建SELECT EXISTS查询?有人能指出我正确的方向吗?我在想这样的事情:
$qb->select('EXISTS(?)')->setParameter($subQuery->getDQL())
Run Code Online (Sandbox Code Playgroud)
这是正确的解决方案吗?
@编辑
经过一段时间的思考,我决定使用 ORM。不幸的是,这也不起作用,我收到一个错误:
line 0, col 7: Error: Expected known function, got 'EXISTS'
DQL 为:
SELECT EXISTS(<subquery here>)
考虑到它是用 QueryBuilder 构建的,这有点奇怪:
/* @var $qb QueryBuilder */
$qb = $this->em->createQueryBuilder();
$qb
->select($qb->expr()->exists($subQuery->getDQL()));
Run Code Online (Sandbox Code Playgroud) 使用以下配置 (doctrine.yaml) 在 Symfony 4 中使用 Doctrine DBAL:
dbal:
# configure these for your database server
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
url: '%env(resolve:DATABASE_URL)%'
driver_class: App\DBAL\Driver\PDOMySql\Driver
Run Code Online (Sandbox Code Playgroud)
和.env:
DATABASE_URL=mysql://root:passwd@127.0.0.1:3306/dbname
Run Code Online (Sandbox Code Playgroud)
我们无法通过 DBAL 连接到数据库:
$conn = DriverManager::getConnection(Constants::connectionParams,new Configuration());
Run Code Online (Sandbox Code Playgroud)
获取驱动程序中发生异常:找不到驱动程序异常。我在 S4 的这个版本中没有找到关于该错误的文档。
尝试使用 Symfony 5 和 Docker 连接到数据库时出现以下错误。
An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused
Run Code Online (Sandbox Code Playgroud)
也许你可以知道我的配置文件出了什么问题。如果我错过了任何可能与此问题相关的配置文件,请告诉我。
docker-compose.yaml:
mysql:
image: mysql:8
ports:
- "3306:3306"
volumes:
- ./docker/database:/docker-entrypoint-initdb.d
environment:
- MYSQL_DATABASE=${DATABASE_NAME}
- MYSQL_ROOT_PASSWORD=${DATABASE_ROOT_PASSWORD}
command: ["--default-authentication-plugin=mysql_native_password"]
Run Code Online (Sandbox Code Playgroud)
学说.yaml:
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)
.env:
DATABASE_URL=mysql://root:root@127.0.0.1:3306/database_name?serverVersion=8.0
DATABASE_ROOT_PASSWORD=root
DATABASE_NAME=database_name
Run Code Online (Sandbox Code Playgroud)
服务定义:
some.repository:
class: Some\Class
arguments:
- '@database_connection'
Run Code Online (Sandbox Code Playgroud) dbal ×11
symfony ×8
doctrine ×4
doctrine-orm ×3
php ×3
docker ×1
driver ×1
laravel ×1
laravel-5 ×1
laravel-5.4 ×1
large-data ×1
mysql ×1
orm ×1
pdo ×1
rest ×1
sql-server ×1
symfony4 ×1