Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony] propel-build-sql
Forum PHP.pl > Forum > PHP > Frameworki
Cezar708
Witam,

mój plik schema.yml wygląda tak:
Kod
propel:
  _attributes:        { package: lib.model }
  users:
    _attributes: { phpName: User }
    id:
    login:       varchar(50)
    password:    varchar(32)
    user_type_id: { type: integer, primaryKey: true, required: true, foreignTable: user_types, foreignReference: id, onDelete: cascade }
  user_types:
    _attributes: { phpName: UserType }
    id:
    name:        varchar(100)

Oczywiście generuje on plik sql o takiej treści (używam sterownika do postgresa: pgsql)
  1. CREATE SEQUENCE "users_seq";
  2. CREATE TABLE "users"
  3. (
  4. "id" INTEGER NOT NULL,
  5. "login" VARCHAR(50),
  6. "password" VARCHAR(32),
  7. "user_type_id" INTEGER NOT NULL,
  8. PRIMARY KEY ("id","user_type_id")
  9. );
  10. COMMENT ON TABLE "users" IS '';
  11.  
  12. SET search_path TO public;
  13. ALTER TABLE "users" ADD CONSTRAINT "users_FK_1" FOREIGN KEY ("user_type_id") REFERENCES "user_types" ("id") ON DELETE CASCADE;
  14.  
  15. CREATE SEQUENCE "user_types_seq";
  16. CREATE TABLE "user_types"
  17. (
  18. "id" INTEGER NOT NULL,
  19. "name" VARCHAR(100),
  20. PRIMARY KEY ("id")
  21. );
  22. COMMENT ON TABLE "user_types" IS '';
  23. SET search_path TO public;

gdy chcę załadować plik do bazy danych występuje taki błąd:
Kod
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "users_pkey" for table "users"

ERROR:  relation "user_types" does not exist


Oczywiście błąd rozumiem, wszystko wróciłoby do normy gdybym deklaracje tych dwóch powyższych tabel zamienił miejscami. Jednak mam pytanie.

Czy istnieje jakiś przełącznik, lub jakiś inny sposób aby plik sql, tworzący schemat bazy danych zawierał na początku pliku deklaracje tabel a na samym końcu wszelkie ADD CONSTRAINT?

Chodzi o to, że stworzyłem dość spory plik schema.yml i nie wiem co zrobić, aby poprawnie załadować plik sql do bazy danych.

(Oczywiście chodzi mi o rozwiązania inne niż zmiana kolejności deklaracji tabel)

Pozdrawiam
jupeter
a nie jest czyściej:
  • zamienić zaminieć nazwę encji z "user_types" na "user_type"
  • wywalić definiowanie "foreignTable"
BTW. Wg dobrych praktyk, polecam nazwy encji w liczbie pojedyńczej a nie mnogiej.
phpion
Ja bym najpierw zdefiniował tabelę user_type, a dopiero później user - nie wiem dlaczego się przed tym tak wzbraniasz.
I tak jak napisał ~jupeter - lepiej nazywaj encje rzeczownikami w liczbie pojedynczej. Dlaczego? Gdyż później otrzymasz w DAO możesz otrzymać metody ze zdublowanym "s" na końcu. Np. *JoinUserss smile.gif inna sprawa, że np. w przypadku Category uzyskasz i tak niepoprawne *Categorys (zamiast *Categories) no ale jednak *ss bardziej razi winksmiley.jpg
Cezar708
Cytat(jupeter @ 14.01.2008, 21:26:05 ) *
  • wywalić definiowanie "foreignTable"


No jak to wywalić foreignTable? A jak mam zdeklarować więzły integralności pomiędzy tabelami?

Cytat(jupeter @ 14.01.2008, 21:26:05 ) *
BTW. Wg dobrych praktyk, polecam nazwy encji w liczbie pojedyńczej a nie mnogiej.

Cytat(phpion @ 14.01.2008, 21:46:52 ) *
I tak jak napisał ~jupeter - lepiej nazywaj encje rzeczownikami w liczbie pojedynczej


Chwila? A co tu do gadania ma nazwa encji? Przecież jak widać w przykładzie jest w _attributes phpName i ta phpName jest w liczbie pojedynczej a nie mnogiej tak jak nazwa encji. W moim mniemaniu tabela użytkowników jest zbiorem użytkowników a nie zbiorem użytkownika, więc naturalne dla mnie jest używanie liczby mnogiej dla nazw encji. Inna sprawa oczywiście dotyczy samej klasy modelu, ale to jak już wcześniej wspomniałem określa phpName. Oczywiście jeśli się mylę to mnie poprawcie.

Cytat(phpion @ 14.01.2008, 21:46:52 ) *
Ja bym najpierw zdefiniował tabelę user_type, a dopiero później user - nie wiem dlaczego się przed tym tak wzbraniasz.


Ja się do tego nie wzbraniam. Po prostu piszę nowy system i już napisałem schema.yml. No i w nim mam pogrupowane tabele pod względem przeznaczenia zawartości i wielu innych czynników. Dzięki temu mam porządek w moim schema.yml. Lecz aby zbudować poprawny plik SQL musiałbym cały plik schema.yml przepisać (a dokładniej pozamieniać miejscami deklaracje tabel) czego chcę uniknąć. Stąd ten post.

Poza tym zadałem podobne pytanie na forum symfony. Odpowiedział mi pewien Niemiec, że się tego nie da zrobić, więc chyba pozostanie mi przepisanie pliku schema.yml
jupeter
Ehh - łapy opadają jak Ciebie słyszę. Ale odpiszę:
Cytat
W moim mniemaniu tabela użytkowników jest zbiorem użytkowników a nie zbiorem użytkownika, więc naturalne dla mnie jest używanie liczby mnogiej dla nazw encji.

Piszesz bez sensu. Encja zawsze jest jakimś zbiorem (z samej definicji). Jakbyś trochę poczytał dokumentację, to byś wiedział że jakbyś zrobił:
Kod
<span class="postcolor">propel:
   user:
     _attributes: { phpName: User }
     id:
     login:       varchar(50)
     password:    varchar(32)
     user_type_id:
   user_type:
     _attributes: { phpName: UserType }
     id:
     name:        varchar(100)</span>


to generowane klasy by się automatycznie połączyły (bez wsadzania foreignTable w schema.yml).
Cytat
Lecz aby zbudować poprawny plik SQL musiałbym cały plik schema.yml przepisać (a dokładniej pozamieniać miejscami deklaracje tabel) czego chcę uniknąć.

Proponuję diagram encji sobie robić i wrzucić jaki JPGa na przykład. Choć podejrzewam że uważasz to za zbędny trud, tak samo jak budowanie encji w liczbie pojedyńczej - które wymyśliło sporo mądrzejszych programistów, przed Tobą.
Cytat
Poza tym zadałem podobne pytanie na forum symfony. Odpowiedział mi pewien Niemiec, że się tego nie da zrobić, więc chyba pozostanie mi przepisanie pliku schema.yml

Następnym razem powiedź, żebym podpisywał się jako Niemiec, żebyś uwierzył blinksmiley.gif .
Cezar708
Cytat(jupeter @ 15.01.2008, 09:16:52 ) *
Ehh - łapy opadają jak Ciebie słyszę. Ale odpiszę:


Nie chcesz nie odpisuj, tym bardziej, że nawet nie podajesz rozwiązania tylko pokazujesz, że da się zrobić to samo innym sposobem, co NIE ZAŁATWIA PROBLEMU!

Cytat(jupeter @ 15.01.2008, 09:16:52 ) *
Piszesz bez sensu. Encja zawsze jest jakimś zbiorem (z samej definicji).


Skoro encja jest zbiorem danych, to dlaczego nie mogę jej nazwać liczbą mnogą. W samej aplikacji będzie to liczba pojedyncza, ponieważ do tego twórcy symfony wymyślili coś takiego jak phpName (o czym już we wcześniejszym poście wspomniałem)

Cytat(jupeter @ 15.01.2008, 09:16:52 ) *
Jakbyś trochę poczytał dokumentację, to byś wiedział że jakbyś zrobił:
Kod
<span class="postcolor">propel:
   user:
     _attributes: { phpName: User }
     id:
     login:       varchar(50)
     password:    varchar(32)
     user_type_id:
   user_type:
     _attributes: { phpName: UserType }
     id:
     name:        varchar(100)</span>


to generowane klasy by się automatycznie połączyły (bez wsadzania foreignTable w schema.yml).


... i co? podałeś mi inne rozwiązanie, które różni się od mojego tym, że ja deklaruje jawnie węzły integralności, a w Twoim przypadku robi to automat. Ja wolę jawnie deklarować węzły... i co? Powiesz mi, że to jest `nie kul`, bo tak nie było w `askeecie`? Fakt jest taki, że nie pomyślałem o tym aby węzły integralności rozwiązywać w ten sposób co Ty, ale to nie oznacza, że dodanie foreignTable jest czymś złym albo wręcz `przeciw sztuce`. Mało tego, ja jeszcze w atrybutach kolumn deklaruję często nazwy sekwencji (jak wspomniałem używam postgresa), żeby potem się połapać. Pomyśl, że skoro w `askeet` pokazali, że można wykorzystać automaty nie oznacza, że trzeba z nich korzystać! Na przykład nie sprawdzą się jak w nazwie encji będę używał wspomnianej liczby mnogiej lub chociażby jakiś prefiks w nazwie tabeli (tak wiem, pewnie zapytasz dlaczego stosować prefiksy w nazwach encji).

Cytat(jupeter @ 15.01.2008, 09:16:52 ) *
Proponuję diagram encji sobie robić i wrzucić jaki JPGa na przykład. Choć podejrzewam że uważasz to za zbędny trud, (...)


hmm... a tu a co autorowi chodzi to nie mam pojęcia. Może chodzi Ci o graficzny projekt bazy... jeśli pytasz to: tak, używałem!

Cytat(jupeter @ 15.01.2008, 09:16:52 ) *
Następnym razem powiedź, żebym podpisywał się jako Niemiec, żebyś uwierzył blinksmiley.gif .


Żałosne zakończenie żałosnego posta

Przepraszam wszystkich za ten offtopic, ale aż ciężko nie odpowiedzieć na takie głupkowate zarzuty. Dlatego ponawiam pytanie.

Cytat
Czy istnieje jakiś przełącznik, lub jakiś inny sposób aby plik sql, tworzący schemat bazy danych zawierał na początku pliku deklaracje tabel a na samym końcu wszelkie ADD CONSTRAINT?
jupeter
Cytat(Cezar708 @ 15.01.2008, 13:12:45 ) *
Nie chcesz nie odpisuj, tym bardziej, że nawet nie podajesz rozwiązania tylko pokazujesz, że da się zrobić to samo innym sposobem, co NIE ZAŁATWIA PROBLEMU!

Faktycznie. Odpowiedź na Twoje pytanie brzmi NIE. Nikt z propela nie pomyślał o tym, żeby układać odwrotnie kolejność encji z wygody. BTW. Zawsze zgłosić im taką poprawkę (i od razu zrobić path'a).

Cytat(Cezar708 @ 15.01.2008, 13:12:45 ) *
Skoro encja jest zbiorem danych, to dlaczego nie mogę jej nazwać liczbą mnogą. W samej aplikacji będzie to liczba pojedyncza, ponieważ do tego twórcy symfony wymyślili coś takiego jak phpName (o czym już we wcześniejszym poście wspomniałem)

... i co? podałeś mi inne rozwiązanie, które różni się od mojego tym, że ja deklaruje jawnie węzły integralności, a w Twoim przypadku robi to automat. Ja wolę jawnie deklarować węzły... i co? Powiesz mi, że to jest `nie kul`, bo tak nie było w `askeecie`? Fakt jest taki, że nie pomyślałem o tym aby węzły integralności rozwiązywać w ten sposób co Ty, ale to nie oznacza, że dodanie foreignTable jest czymś złym albo wręcz `przeciw sztuce`. Mało tego, ja jeszcze w atrybutach kolumn deklaruję często nazwy sekwencji (jak wspomniałem używam postgresa), żeby potem się połapać. Pomyśl, że skoro w `askeet` pokazali, że można wykorzystać automaty nie oznacza, że trzeba z nich korzystać! Na przykład nie sprawdzą się jak w nazwie encji będę używał wspomnianej liczby mnogiej lub chociażby jakiś prefiks w nazwie tabeli (tak wiem, pewnie zapytasz dlaczego stosować prefiksy w nazwach encji).

I co? I nic - kwestia wyboru.
Nie zmuszę cię do tego, żebyś nie powielał kodu. Ani do tego, że przyjęło się stosować liczbę pojedyńczą. Twój wybór, ja tylko podałem swoje zdanie (bo o nie pytałeś).

Cytat(Cezar708 @ 15.01.2008, 13:12:45 ) *
Przepraszam wszystkich za ten offtopic, ale aż ciężko nie odpowiedzieć na takie głupkowate zarzuty. Dlatego ponawiam pytanie.


Zamknijmy ten topic - odpowiedź na postawione pytanie: nie da się.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.