Merge pull request #611 from acelaya-forks/feature/db-migrate-syntax-error

Feature/db migrate syntax error
This commit is contained in:
Alejandro Celaya 2020-01-10 19:17:45 +01:00 committed by GitHub
commit 1a8bf54e8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 60 additions and 5 deletions

View File

@ -4,6 +4,30 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org). The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org).
## [Unreleased]
#### Added
* *Nothing*
#### Changed
* *Nothing*
#### Deprecated
* *Nothing*
#### Removed
* *Nothing*
#### Fixed
* [#607](https://github.com/shlinkio/shlink/issues/607) Added missing info on UPGRADE.md doc.
* [#610](https://github.com/shlinkio/shlink/issues/610) Fixed use of hardcoded quotes on a database migration which makes it fail on postgres.
## 2.0.0 - 2020-01-08 ## 2.0.0 - 2020-01-08
#### Added #### Added

View File

@ -9,18 +9,35 @@ use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\Migrations\AbstractMigration; use Doctrine\Migrations\AbstractMigration;
use function Functional\some;
final class Version20200105165647 extends AbstractMigration final class Version20200105165647 extends AbstractMigration
{ {
private const COLUMNS = ['lat' => 'latitude', 'lon' => 'longitude']; private const COLUMNS = ['lat' => 'latitude', 'lon' => 'longitude'];
/**
* @throws DBALException
*/
public function preUp(Schema $schema): void public function preUp(Schema $schema): void
{ {
$visitLocations = $schema->getTable('visit_locations');
$this->skipIf(some(
self::COLUMNS,
fn (string $v, string $newColName) => $visitLocations->hasColumn($newColName),
), 'New columns already exist');
foreach (self::COLUMNS as $columnName) { foreach (self::COLUMNS as $columnName) {
$qb = $this->connection->createQueryBuilder(); $qb = $this->connection->createQueryBuilder();
$qb->update('visit_locations') $qb->update('visit_locations')
->set($columnName, '"0"') ->set($columnName, ':zeroValue')
->where($columnName . '=""') ->where($qb->expr()->orX(
->orWhere($columnName . ' IS NULL') $qb->expr()->eq($columnName, ':emptyString'),
$qb->expr()->isNull($columnName),
))
->setParameters([
'zeroValue' => '0',
'emptyString' => '',
])
->execute(); ->execute();
} }
} }
@ -33,16 +50,24 @@ final class Version20200105165647 extends AbstractMigration
$visitLocations = $schema->getTable('visit_locations'); $visitLocations = $schema->getTable('visit_locations');
foreach (self::COLUMNS as $newName => $oldName) { foreach (self::COLUMNS as $newName => $oldName) {
$visitLocations->addColumn($newName, Types::FLOAT); $visitLocations->addColumn($newName, Types::FLOAT, [
'default' => '0.0',
]);
} }
} }
/**
* @throws DBALException
*/
public function postUp(Schema $schema): void public function postUp(Schema $schema): void
{ {
$platformName = $this->connection->getDatabasePlatform()->getName();
$castType = $platformName === 'postgres' ? 'DOUBLE PRECISION' : 'DECIMAL(9,2)';
foreach (self::COLUMNS as $newName => $oldName) { foreach (self::COLUMNS as $newName => $oldName) {
$qb = $this->connection->createQueryBuilder(); $qb = $this->connection->createQueryBuilder();
$qb->update('visit_locations') $qb->update('visit_locations')
->set($newName, $oldName) ->set($newName, 'CAST(' . $oldName . ' AS ' . $castType . ')')
->execute(); ->execute();
} }
} }

View File

@ -9,6 +9,8 @@ use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use Doctrine\Migrations\AbstractMigration; use Doctrine\Migrations\AbstractMigration;
use function Functional\none;
final class Version20200106215144 extends AbstractMigration final class Version20200106215144 extends AbstractMigration
{ {
private const COLUMNS = ['latitude', 'longitude']; private const COLUMNS = ['latitude', 'longitude'];
@ -19,6 +21,10 @@ final class Version20200106215144 extends AbstractMigration
public function up(Schema $schema): void public function up(Schema $schema): void
{ {
$visitLocations = $schema->getTable('visit_locations'); $visitLocations = $schema->getTable('visit_locations');
$this->skipIf(none(
self::COLUMNS,
fn (string $oldColName) => $visitLocations->hasColumn($oldColName),
), 'Old columns do not exist');
foreach (self::COLUMNS as $colName) { foreach (self::COLUMNS as $colName) {
$visitLocations->dropColumn($colName); $visitLocations->dropColumn($colName);