小编Oll*_*etz的帖子

Doctrine 迁移:为 mysql 和 postgresql 创建代码

我在 Symfony 3.4.4 项目中使用 Doctrine ORM 2.6.1。我的一些实例在 MySQL 数据库上运行,一些在 Postgresql 上运行,还有一些安装甚至可以访问 MicosoftSQL 服务器。这工作正常,无需对我的项目或实体进行任何特殊更改,我只需配置相应的连接参数。

但是:如果我创建迁移,则只会在迁移文件中创建与当前数据库连接兼容的语句。

我使用 postgres 连接进行开发,所以我只生成 postgresql 语句,例如:

class Version20180430083616 extends AbstractMigration
{
    public function up(Schema $schema)
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'postgresql', 'Migration can only be executed safely on \'postgresql\'.');

        $this->addSql('DELETE FROM document_category');
        $this->addSql('DROP SEQUENCE document_category_id_seq CASCADE');
        $this->addSql('DROP TABLE document_category');
    }

    public function down(Schema $schema)
    {
        // this down() migration is auto-generated, please modify it to your needs …
Run Code Online (Sandbox Code Playgroud)

doctrine doctrine-migrations

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

具有自引用的继承实体ManyToMany:EXTRA_LAZY获取模式不起作用

我必须遵循以下设置:父类

/**
 * @ORM\Entity()
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 */
abstract class DataCategory
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    //...
}
Run Code Online (Sandbox Code Playgroud)

以及几个包含对父项的引用的派生类(仅显示一个)

/**
 * @ORM\Entity
 */
class MultiCompoundDataCategory extends DataCategory
{
    /**
     * @ORM\ManyToMany(targetEntity="DataCategory", fetch="EXTRA_LAZY")
     * @ORM\JoinTable(name="multi_compound_data_category_data_category",
     *      joinColumns={@ORM\JoinColumn(name="multi_compound_data_category", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="data_category", referencedColumnName="id")})
     */
    public $summands;


    public function __construct()
    {
        $this->summands = new ArrayCollection();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当通过加载所有MultiCompoundDataCategories时 $this->getDoctrine()->getRepository(MultiCompoundDataCategory::class)->findAll(),不仅会发出MultiCompoundDataCategories上的一个选择(在ManyToMany表上使用连接).相反,我得到一个主查询,然后是每个 summand 的一个查询,每个查询都有一个大的胖序列LEFT JOIN(文档包含有关此问题的警告,我正在大量引用继承树的非叶节点).

顺便说一句: …

doctrine lazy-loading class-table-inheritance

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

gitlab-ci 脚本中的用户输入会发生什么情况

我想知道如果 gitlab-ci.yml 配置中的命令要求用户输入会发生什么?

test1:
  stage: test
  script:
    - bash script.sh
Run Code Online (Sandbox Code Playgroud)

和脚本.sh:

#!/bin/bash
# This script will test if you have given a leap year or not.

echo "Type the year that you want to check (4 digits), followed by [ENTER]:"

read year
Run Code Online (Sandbox Code Playgroud)

我认为这是一个非常标准的情况,但我以前从未考虑过。

如果在 docker 中以非交互方式执行相同的脚本,也可能会出现同样的问题:

docker exec container_name bash script.sh
Run Code Online (Sandbox Code Playgroud)

bash gitlab-ci

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

在同情中解决不平等问题

我想在同情中解决以下不平等问题

(10000 / x) - 1 < 0
Run Code Online (Sandbox Code Playgroud)

所以我发出命令

solve_poly_inequality( Poly((10000 / x) - 1 ), '<')
Run Code Online (Sandbox Code Playgroud)

结果我得到了

[Interval.open(-oo, 1/10000)]
Run Code Online (Sandbox Code Playgroud)

但是,我的手动计算给出x <0或x> 10000.

我错过了什么?由于-1,我不能将它表示为理性函数,因为-1.

提前致谢!

python sympy

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

postgresql:alpine docker 容器中的 Cron

我正在使用“普通”postgresql:alpine docker 映像,但必须每天安排数据库备份。我认为这是一个非常常见的任务。

我创建了一个脚本backup并将其存储在容器中/etc/periodic/15min,并使其可执行:

bash-4.4# ls -l /etc/periodic/15min/
total 4
-rwxr-xr-x    1 root     root            95 Mar  2 15:44 backup
Run Code Online (Sandbox Code Playgroud)

我尝试手动执行它,效果很好。

我的问题是crond自动运行。

如果我 exec docker exec my-postgresql-container crond,守护进程将启动并且 cron 工作,但我想将其嵌入到我的 Dockerfile 中

FROM postgres:alpine

# my backup script, MUST NOT have .sh extension
COPY backup.sh /etc/periodic/15min/backup 
RUN chmod a+x /etc/periodic/15min/backup

RUN crond # <- doesn't work
Run Code Online (Sandbox Code Playgroud)

我不知道如何重写或覆盖官方镜像中的命令。出于更新原因,如果可能的话,我也想保留这些图像。

postgresql cron docker docker-container

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

是否可以在 postPersist 中冲洗?

我已经阅读了关于生命周期事件的文档,以及关于在生命周期事件期间更改或持久化新实体的几个问题。打电话EnitityManager::flush()好像有问题。

好的,但是仔细查看 docs,有一个代码示例,其中在 postPersist 中更改了字段,但没有调用刷新。

我检查了一下,建议的更改没有写入数据库。只有被持久化的对象才会收到更改。

<?php

/** @Entity @HasLifecycleCallbacks */
class User
{
    // ...

    /**
     * @Column(type="string", length=255)
     */
    public $value;


    /** @PostPersist */
    public function doStuffOnPostPersist()
    {
        $this->value = 'changed from postPersist callback!';
    }
}
Run Code Online (Sandbox Code Playgroud)

也许应该将其添加到文档中。一开始我被误导了。

但是,当添加 LifecyleEventArgs 参数并刷新包含的 EntityManager 时,它们将写入 DB:

/** @PostPersist */
public function doStuffOnPostPersist(LifecycleEventArgs $args)
{
    $this->value = 'changed from postPersist callback!';
    $args->getEntityManager()->flush(); // works in my tests. Is this safe to use ?

}
Run Code Online (Sandbox Code Playgroud)

我不知道如何 …

doctrine symfony doctrine-orm

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

内存占用太大

我尝试了一些简单变量的内存使用,遇到了意想不到的结果,请看这段代码:

        $datetimes = [];
        $memory_before = memory_get_usage();

        for ($x = 0; $x < 1000; $x++) {
            $datetimes[] = new \DateTime();
        }
        var_dump('DateTimes: ' . (memory_get_usage() - $memory_before));


        $ints = [];
        $memory_before = memory_get_usage();

        for ($x = 0; $x < 1000; $x++) {
            $ints[] = $x;
        }
        var_dump('Integers: ' . (memory_get_usage() - $memory_before));
Run Code Online (Sandbox Code Playgroud)

我得到这个输出(在 PHP 7.4,64 位):

string(17) "DateTimes: 350504"
string(15) "Integers: 37160"
Run Code Online (Sandbox Code Playgroud)

1000 个整数的 37 KB 内存对我来说没有意义,对吧?我期望 8000 字节加上一些数组开销。

我的实验规模:对于一百万个整数,我得到 33558808 字节的内存使用量。

我已禁用 xdebug。

php

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