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?
Author: Marek S
Date: Mon, 15 Apr 2019 22:31
Date: Mon, 15 Apr 2019 22:31
38 lines
2427 bytes
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?
Author: Wojciech Bancer
Date: Tue, 16 Apr 2019 07:43
Date: Tue, 16 Apr 2019 07:43
21 lines
1748 bytes
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?
Author: Marek S
Date: Tue, 16 Apr 2019 20:39
Date: Tue, 16 Apr 2019 20:39
92 lines
3319 bytes
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?
Author: Wojciech Bancer
Date: Tue, 16 Apr 2019 20:59
Date: Tue, 16 Apr 2019 20:59
47 lines
2080 bytes
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?
Author: Marek S
Date: Wed, 17 Apr 2019 19:11
Date: Wed, 17 Apr 2019 19:11
50 lines
3191 bytes
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?
Author: Wojciech Bancer
Date: Thu, 18 Apr 2019 11:30
Date: Thu, 18 Apr 2019 11:30
35 lines
2532 bytes
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?
Author: Marek S
Date: Thu, 18 Apr 2019 21:22
Date: Thu, 18 Apr 2019 21:22
10 lines
1345 bytes
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