标签: dbal

Symfony2/Doctrine使$ statement-> execute()不是"缓冲"所有值

我有一个这样的基本代码集(在控制器内):

$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?

pdo large-data symfony doctrine-orm dbal

3
推荐指数
2
解决办法
4439
查看次数

多个连接无法识别的选项"mapping_types"

我正在尝试将"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,因为我找到了解决这个问题的答案.但这些问题没有多重联系.

php symfony doctrine-orm dbal

3
推荐指数
1
解决办法
2080
查看次数

将Doctrine与REST API一起使用

是否可以将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)

谢谢您的回答!!

rest doctrine driver symfony dbal

3
推荐指数
1
解决办法
2238
查看次数

原则:ORM QueryBuilder或DBAL QueryBuilder

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语句)

orm query-builder symfony doctrine-orm dbal

3
推荐指数
2
解决办法
3036
查看次数

如何迁移变化列类型?

我得到一个错误,当我尝试列的类型从字符串文本,随着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)

                                                                                                                                          [Doctrine\DBAL\Driver\PDOException]                                   
Run Code Online (Sandbox Code Playgroud)

SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column …

dbal laravel laravel-5 laravel-5.4

3
推荐指数
1
解决办法
2202
查看次数

使用多个连接时自动装配特定的 DBAL 连接

我正在使用 Doctrine 2,其中我有多个 DBAL 连接。我在 ORM 中也有多个 EntityManager。

我需要能够以某种方式将特定的 DBAL 连接自动连接到其他 Symfony 3 服务中。

我可以使用 EntityManagerDecorator 自动装配任何 EntitiyManager 但不知道如何对连接执行相同的操作。我能够从 EntityManager 获得连接,但我认为这不是可行的方法。

doctrine symfony dbal

3
推荐指数
1
解决办法
4203
查看次数

SQL Update语句的双重结果

我已经用这个问题抓了几个小时......这就是发生的事情:

我运行这个声明

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

sql-server sql-server-2008-r2 dbal

2
推荐指数
1
解决办法
2507
查看次数

使用Doctrine DBAL在预准备语句中的字符串列表

遵循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)

我做错什么了吗?

php doctrine dbal

2
推荐指数
2
解决办法
6745
查看次数

Doctrine2 DBAL 存在查询

我想请求您帮助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)

mysql symfony dbal

2
推荐指数
1
解决办法
2939
查看次数

symfony 4:驱动程序发生异常:找不到驱动程序

使用以下配置 (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 的这个版本中没有找到关于该错误的文档。

doctrine symfony dbal symfony4

2
推荐指数
1
解决办法
1万
查看次数

Symfony 5 + Docker:SQLSTATE[HY000] [2002] 连接被拒绝

尝试使用 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)

php symfony dbal docker

1
推荐指数
1
解决办法
6392
查看次数