我在 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) 我必须遵循以下设置:父类
/**
* @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
(文档也包含有关此问题的警告,我正在大量引用继承树的非叶节点).
顺便说一句: …
我想知道如果 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) 我想在同情中解决以下不平等问题
(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.
提前致谢!
我正在使用“普通”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)
我不知道如何重写或覆盖官方镜像中的命令。出于更新原因,如果可能的话,我也想保留这些图像。
我已经阅读了关于生命周期事件的文档,以及关于在生命周期事件期间更改或持久化新实体的几个问题。打电话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)
我不知道如何 …
我尝试了一些简单变量的内存使用,遇到了意想不到的结果,请看这段代码:
$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。
doctrine ×3
bash ×1
cron ×1
docker ×1
doctrine-orm ×1
gitlab-ci ×1
lazy-loading ×1
php ×1
postgresql ×1
python ×1
symfony ×1
sympy ×1