🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.php
7 messages
7 total messages Started by Marek S Mon, 15 Apr 2019 22:31
Migracje w Symfony 4 - jak je budować automatycznie?
#232370
Author: Marek S
Date: Mon, 15 Apr 2019 22:31
38 lines
2427 bytes
Witam,

Czy w ogóle da się to wykonać? Jechałem w/g tutoriala: założyłem encję 
users z polem "name" typu string 255 not null + repository. Bazą jest 
PostgreSQL 10. Patrzę jaki z tego SQL powstał i jak to działa - ręce 
załamuję.

$this->addSql('CREATE SEQUENCE users_id_seq INCREMENT BY 1 MINVALUE 1 
START 1');

$this->addSql('CREATE TABLE users (id INT NOT NULL, name VARCHAR(255) 
NOT NULL, PRIMARY KEY(id))');

Oto moje wątpliwości:

- Automatycznie powstało pole ID. Symfony założyło, że ja chcę mieć je 
4-ro bajtowe. Tymczasem ja wiem, że chcę 8-bajtowe. Czy ręcznie muszę to 
poprawić w migracji?

- Kolejna rzecz to pop... struktura pola ID. Powinno być BIGSERIAL 
PRIMARY KEY. Tymczasem w zamian dostaję wykreowanie niepotrzebnej 
sekwencji, stworzenie ID 4-ro bajtowego. Przy tworzeniu rekordu 
wywoływane są 2 SQLe: nextval z sekwencji, a potem  użycie tej wartości 
w insert do tabeli users. Po co mi to? Powinien być 1 SQL w postaci 
wstawienia nowego "name" użytkownika. ID powinien sam się wygenerować 
korzystając z funkcjonalności bazy (niejawne sekwencje przypisywane do ID).

Czy da się takie podstawy tworzenia i korzystania z baz danych 
zaimplementować do tworzenia migracji?

Owszem, mogę ręcznie zapodać w migracji SQLe ale obawiam się, że np. 
INSERTy ORM będą próbowały pobierać ID z nieistniejących i 
niepotrzebnych sekwencji. Zapewne da się jakoś skonfigurować gdzieś by 
IDki nie wymagały dodatkowych odczytów i zaufały bazie?

-- 
Pozdrawiam,
Marek
Re: Migracje w Symfony 4 - jak je budować automatycznie?
#232371
Author: Wojciech Bancer
Date: Tue, 16 Apr 2019 07:43
21 lines
1748 bytes
On 2019-04-15, Marek S <precz@spamowi.com> wrote:

> Czy w ogóle da się to wykonać? Jechałem w/g tutoriala: założyłem encję 
> users z polem "name" typu string 255 not null + repository. Bazą jest 
> PostgreSQL 10. Patrzę jaki z tego SQL powstał i jak to działa - ręce 
> załamuję.

Symfony nie ma nic do tego, bazy obsługuje Doctrine.
A Doctrine zrobił najprawdopodobniej to co mu kazałeś.
Pokaż definicję tej encji, bo bez tego to się tylko można domyślać.

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html

A w szczególności:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html#doctrine-mapping-types
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/basic-mapping.html#identifier-generation-strategies

-- 
Wojciech Bańcer
wojciech.bancer@gmail.com
Re: Migracje w Symfony 4 - jak je budować automatycznie?
#232372
Author: Marek S
Date: Tue, 16 Apr 2019 20:39
92 lines
3319 bytes
W dniu 2019-04-16 o 09:43, Wojciech Bancer pisze:
> 
> Symfony nie ma nic do tego, bazy obsługuje Doctrine.

Doctrine to nie jest jeden z pierdyliona komponentów Symfony?

> A Doctrine zrobił najprawdopodobniej to co mu kazałeś.
> Pokaż definicję tej encji, bo bez tego to się tylko można domyślać.

Proszę bardzo:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
  * @ORM\Entity(repositoryClass="App\Repository\UsersRepository")
  */
class Users
{
     /**
      * @ORM\Id()
      * @ORM\GeneratedValue()
      * @ORM\Column(type="integer")
      */
     private $id;

     /**
      * @ORM\Column(type="string", length=255)
      */
     private $name;

     public function getId(): ?int
     {
         return $this->id;
     }

     public function getName(): ?string
     {
         return $this->name;
     }

     public function setName(string $name): self
     {
         $this->name = $name;

         return $this;
     }
}

Co do typów mapowania, to jeszcze nie wiem, gdzie tego się dokonuje. 
Znalazłem w config/packages/doctrine.yaml

parameters:
     # Adds a fallback DATABASE_URL if the env var is not set.
     # This allows you to run cache:warmup even if your
     # environment variables are not available yet.
     # You should not need to change this value.
     env(DATABASE_URL): ''

doctrine:
     dbal:
         # configure these for your database server
         driver: 'pdo_pgsql'
         server_version: '10.5'
         charset: utf8
         default_table_options:
             charset: utf8
             collate: utf8_unicode_ci

         url: '%env(resolve:DATABASE_URL)%'
     orm:
         auto_generate_proxy_classes: true
         naming_strategy: doctrine.orm.naming_strategy.underscore
         auto_mapping: true
         mappings:
             App:
                 is_bundle: false
                 type: annotation
                 dir: '%kernel.project_dir%/src/Entity'
                 prefix: 'App\Entity'
                 alias: App

Czy o to chodziło?

Generalnie wszystko działo się samo: ja niczego nie "kazałem" poza 
podaniem typu pola name. Generator make:entity nie pytał się mnie o 
żadne sekwencje, o primary key też nie. Nie miałem na nic wpływu.

-- 
Pozdrawiam,
Marek
Re: Migracje w Symfony 4 - jak je budować automatycznie?
#232373
Author: Wojciech Bancer
Date: Tue, 16 Apr 2019 20:59
47 lines
2080 bytes
On 2019-04-16, Marek S <precz@spamowi.com> wrote:

[...]

>> Symfony nie ma nic do tego, bazy obsługuje Doctrine.
>
> Doctrine to nie jest jeden z pierdyliona komponentów Symfony?

Nie. To jest niezależny ORM.

>> A Doctrine zrobił najprawdopodobniej to co mu kazałeś.
>> Pokaż definicję tej encji, bo bez tego to się tylko można domyślać.
>
> Proszę bardzo:
>
> namespace App\Entity;
>
> use Doctrine\ORM\Mapping as ORM;
>
> /**
>   * @ORM\Entity(repositoryClass="App\Repository\UsersRepository")
>   */
> class Users
> {
>      /**
>       * @ORM\Id()
>       * @ORM\GeneratedValue()
>       * @ORM\Column(type="integer")
>       */
>      private $id;

^^^
no i tu powyżej. Masz type="integer" (a chcesz pewnie "bigint").
https://www.postgresql.org/docs/9.1/datatype-numeric.html

A poeksperymentuj z:
@ORM\GeneratedValue(strategy="AUTO")

strategy="AUTO" jest jak nic nie wpiszesz. Zgodnie z tym:
https://stackoverflow.com/questions/14022374/the-differences-between-generatedvalue-strategies
dla postgresa ustawiane jest wtedy SEQUENCE.

[...]

-- 
Wojciech Bańcer
wojciech.bancer@gmail.com
Re: Migracje w Symfony 4 - jak je budować automatycznie?
#232374
Author: Marek S
Date: Wed, 17 Apr 2019 19:11
50 lines
3191 bytes
W dniu 2019-04-16 o 22:59, Wojciech Bancer pisze:

>> Doctrine to nie jest jeden z pierdyliona komponentów Symfony?
> 
> Nie. To jest niezależny ORM.

Aaaahaa, rozumiem. Zmyliło mnie to, że dokumentacja Symfony:
https://symfony.com/doc/current/doctrine.html
prezentuje doctrine jako "swoje". Raczej nie spotyka się żeby instrukcja 
do "obcego plugina" stawała się częścią dokumentacji produktu. W 
dodatku, jak poszukałem więcej po Google zainspirowany tym, co 
napisałeś, potwierdziło się, że doctrine ma swoją stronę WWW a Symfony 
tylko pobieżnie opisuje posługiwanie się nią. Byłem przekonany, że to 
komplet informacji. Zdumiewa mnie takie podejście Symfony w zakresie 
tworzenia dokumentacji. Więcej dowiaduję się od Ciebie np.


W związku z tym mam pytanie co do mojego wyboru. Czy ten ORM jest 
właściwy? Są lepsze? Chciałbym uniknąć wtopy w połowie tworzenia 
pierwszego projektu, w postaci takiej, że np. enumów, money, array, ip 
(i innych) nie utworzy, a nawet jeśli utworzy, to nie będzie potrafił 
tego obsłużyć z poziomu ORM. Pewnie da się ... ale wolę zapytać.

Jak zaczynam się zapoznawać z dokumentacją na stronie autora, to ten ORM 
wygląda naprawdę dobrze i jest dość łatwy do ogarnięcia, co mnie cieszy.

> no i tu powyżej. Masz type="integer" (a chcesz pewnie "bigint").

Dokładnie tak.

Aaahaa... czyli jeśli wstawię tu coś innego, to podczas generowania 
migracji, prawidłowe typy pól zostaną przekazane do SQL?

> A poeksperymentuj z:
> @ORM\GeneratedValue(strategy="AUTO")

Oki, sprawdzę. IDENTITY wydaje się być właściwą opcją.

> strategy="AUTO" jest jak nic nie wpiszesz. Zgodnie z tym:
> https://stackoverflow.com/questions/14022374/the-differences-between-generatedvalue-strategies
> dla postgresa ustawiane jest wtedy SEQUENCE.

Swoją drogą, kto wpadł na tak pokraczny pomysł by defaultowo sekwencje 
tworzyć a potem inserty realizować 2ma zapytaniami SQL... Nie 
przypominam sobie abym np. w Postgresie w wersji 6 (od niej zaczynałem) 
musiał takie rzeczy robić.

-- 
Pozdrawiam,
Marek
Re: Migracje w Symfony 4 - jak je budować automatycznie?
#232375
Author: Wojciech Bancer
Date: Thu, 18 Apr 2019 11:30
35 lines
2532 bytes
On 2019-04-17, Marek S <precz@spamowi.com> wrote:

[...]

> właściwy? Są lepsze? Chciałbym uniknąć wtopy w połowie tworzenia 
> pierwszego projektu, w postaci takiej, że np. enumów, money, array, ip 
> (i innych) nie utworzy, a nawet jeśli utworzy, to nie będzie potrafił 
> tego obsłużyć z poziomu ORM. Pewnie da się ... ale wolę zapytać.
>
> W związku z tym mam pytanie co do mojego wyboru. Czy ten ORM jest 

Nie mam zdania który najlepszy. W Laravelu masz Eloquent ORM i możesz
też zainstalować np. taki bundle do symfony:
https://packagist.org/packages/wouterj/eloquent-bundle

A ORMów jest z pewnością więcej:
https://www.slant.co/topics/5639/~php-orms
Doctrine jest najpopularniejszy.

Ja już od dłuższego czasu (3 lata) jestem mocno "poza PHP", więc mogę mieć 
nieaktualną wiedzę.

>> no i tu powyżej. Masz type="integer" (a chcesz pewnie "bigint").
>
> Dokładnie tak.
>
> Aaahaa... czyli jeśli wstawię tu coś innego, to podczas generowania 
> migracji, prawidłowe typy pól zostaną przekazane do SQL?

Tak.
Konfigurujesz sobie schemat bazy w tych anotacjach.

-- 
Wojciech Bańcer
wojciech.bancer@gmail.com
Re: Migracje w Symfony 4 - jak je budować automatycznie?
#232376
Author: Marek S
Date: Thu, 18 Apr 2019 21:22
10 lines
1345 bytes
W dniu 2019-04-18 o 13:30, Wojciech Bancer pisze:

> Tak.
> Konfigurujesz sobie schemat bazy w tych anotacjach.

Ok, dzięki. Teraz czas na popracowanie i otrzaskanie się w środowisku. :-)

-- 
Pozdrawiam,
Marek
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads