Thread View: pl.comp.lang.python
5 messages
5 total messages
Started by Daniel Mróz
Mon, 13 Jul 2009 13:51
Tworzenie tabel w Elixir
Author: Daniel Mróz
Date: Mon, 13 Jul 2009 13:51
Date: Mon, 13 Jul 2009 13:51
42 lines
2695 bytes
2695 bytes
Cześć
Utworzyłem sobie jakieś tam klasy w ORMie i chciałbym teraz utworzyć
odpowiednie tabele w bazie danych. Używam do tego elixir.create_all(),
która na SQLite robi to co powinna, jednakże po zmianie silnika na MySQL
wywołanie jej wywala wyjątek:
ProgrammingError: (ProgrammingError) (1146, "Table 'db.entities_user' doesn't exist") 'DESCRIBE `entities_user`' ()
Zgodnie z tym, co wyczytałem, SQLAlchemy wykonuje najpierw DESCRIBE
i jeśli nie znajdzie jakiejś tabeli, tworzy ją. W tym przypadku jednak
rzuca wyjątek i nie tworzy tabel. Jak zmusić Elixir do utworzenia
odpowiednich struktur w bazie danych?
Kod:
In [3]: import entities as model
In [4]: elixir.metadata.bind = 'mysql://user:pass@host/db'
In [5]: elixir.metadata.bind.echo = True
In [6]: model.setup_all()
In [7]: model.create_all()
2009-07-13 18:35:54,307 INFO sqlalchemy.engine.base.Engine.0x...bd4c SHOW VARIABLES LIKE 'sql_mode'
2009-07-13 18:35:54,310 INFO sqlalchemy.engine.base.Engine.0x...bd4c ()
2009-07-13 18:35:54,312 INFO sqlalchemy.engine.base.Engine.0x...bd4c DESCRIBE `entities_user`
2009-07-13 18:35:54,312 INFO sqlalchemy.engine.base.Engine.0x...bd4c ()
2009-07-13 18:35:54,314 INFO sqlalchemy.engine.base.Engine.0x...bd4c ROLLBACK
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (18, 0))
[...]
ProgrammingError: (ProgrammingError) (1146, "Table 'db.entities_user' doesn't exist") 'DESCRIBE `entities_user`' ()
Pozdrawiam
Beorn
--
Daniel 'Beorn' Mróz <beorn@alpha.pl> http://127.0.0.1/beorn
[GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---]
[O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*]
[ r++ y+ ]
Re: Tworzenie tabel w Elixir
Author: Rob Wolfe
Date: Mon, 13 Jul 2009 21:01
Date: Mon, 13 Jul 2009 21:01
50 lines
2806 bytes
2806 bytes
Daniel Mróz <beorn@alpha.pl> writes:
> Cześć
>
> Utworzyłem sobie jakieś tam klasy w ORMie i chciałbym teraz utworzyć
> odpowiednie tabele w bazie danych. Używam do tego elixir.create_all(),
> która na SQLite robi to co powinna, jednakże po zmianie silnika na MySQL
> wywołanie jej wywala wyjątek:
>
> ProgrammingError: (ProgrammingError) (1146, "Table 'db.entities_user' doesn't exist") 'DESCRIBE `entities_user`' ()
>
>
> Zgodnie z tym, co wyczytałem, SQLAlchemy wykonuje najpierw DESCRIBE
> i jeśli nie znajdzie jakiejś tabeli, tworzy ją. W tym przypadku jednak
> rzuca wyjątek i nie tworzy tabel. Jak zmusić Elixir do utworzenia
> odpowiednich struktur w bazie danych?
>
> Kod:
>
> In [3]: import entities as model
> In [4]: elixir.metadata.bind = 'mysql://user:pass@host/db'
> In [5]: elixir.metadata.bind.echo = True
> In [6]: model.setup_all()
> In [7]: model.create_all()
> 2009-07-13 18:35:54,307 INFO sqlalchemy.engine.base.Engine.0x...bd4c SHOW VARIABLES LIKE 'sql_mode'
> 2009-07-13 18:35:54,310 INFO sqlalchemy.engine.base.Engine.0x...bd4c ()
> 2009-07-13 18:35:54,312 INFO sqlalchemy.engine.base.Engine.0x...bd4c DESCRIBE `entities_user`
> 2009-07-13 18:35:54,312 INFO sqlalchemy.engine.base.Engine.0x...bd4c ()
> 2009-07-13 18:35:54,314 INFO sqlalchemy.engine.base.Engine.0x...bd4c ROLLBACK
> ERROR: An unexpected error occurred while tokenizing input
> The following traceback may be corrupted or invalid
> The error message is: ('EOF in multi-line statement', (18, 0))
> [...]
> ProgrammingError: (ProgrammingError) (1146, "Table 'db.entities_user' doesn't exist") 'DESCRIBE `entities_user`' ()
To mi wygląda na problem w samym MySQLdb [1]_.
Sprawdziłem z tymi wersjami:
>>> import MySQLdb
>>> MySQLdb.__version__
'1.2.2'
>>> import elixir
>>> elixir.__version__
'0.6.1'
i wszystko działa bez zarzutu.
.. [1] http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg13715.html
RW
Re: Tworzenie tabel w Elixir
Author: Daniel Mróz
Date: Tue, 14 Jul 2009 17:01
Date: Tue, 14 Jul 2009 17:01
16 lines
1464 bytes
1464 bytes
On 14.07.2009, Rob Wolfe <rw@smsnet.pl> wrote: > assert e.args[0] == 1146, e.args > Jeśli to zadziała, to faktycznie nie tu leży problem. Masz rację, dostaję obiekt wyjątku. Pytanie zatem dlaczego u Ciebie to przeszło pomimo tych samych wersji MySQLdb i Elixir. Powalczę z tym później. Pozdrawiam Beorn -- Daniel 'Beorn' Mróz <beorn@alpha.pl> http://127.0.0.1/beorn [GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---] [O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*] [ r++ y+ ]
Re: Tworzenie tabel w Elixir
Author: Daniel Mróz
Date: Tue, 14 Jul 2009 17:20
Date: Tue, 14 Jul 2009 17:20
34 lines
2233 bytes
2233 bytes
On 13.07.2009, Rob Wolfe <rw@smsnet.pl> wrote: >> ProgrammingError: (ProgrammingError) (1146, "Table 'db.entities_user' doesn't exist") 'DESCRIBE `entities_user`' () > To mi wygląda na problem w samym MySQLdb [1]_. Możliwe, ale to mi nie wygląda na przekazywanie obiektu wyjątku jako pierwszego argumentu. Jak dla mnie Exception.args jest OK, MySQLdb reaguje prawidłowo na próbę zrobienia DESCRIBE na nieistniejącej tabeli, lecz Elixir nie przechwytuje tego wyjątku (a raczej przechwytuje jedynie aby zrobić ROLLBACK). Mogę jednak się mylić. > Sprawdziłem z tymi wersjami: >>>> import MySQLdb >>>> MySQLdb.__version__ > '1.2.2' >>>> import elixir >>>> elixir.__version__ > '0.6.1' > > i wszystko działa bez zarzutu. U mnie te same wersje i niestety kiszka. Mogę użyć checking=False, lecz to zadziała jedynie przy tworzeniu nowej struktury. Problem będzie przy aktualizacji aplikacji i dodawaniu nowych tabel. Narazie zrobiłem workaround, bo czas goni i nie mogę się zbytnio teraz bawić w analizę kodu Elixira. Dziękuję za pomoc. Pozdrawiam Beorn -- Daniel 'Beorn' Mróz <beorn@alpha.pl> http://127.0.0.1/beorn [GIT d s:- a-@ C++++ UL++++$ P+ L++++ E--- W+ N+++ o? K- w---] [O- M- V! PS+ PE++ Y+ PGP++ t- 5 X R !tv b+ DI D++ G++ e h*] [ r++ y+ ]
Re: Tworzenie tabel w Elixir
Author: Rob Wolfe
Date: Tue, 14 Jul 2009 19:32
Date: Tue, 14 Jul 2009 19:32
31 lines
2031 bytes
2031 bytes
Daniel Mróz <beorn@alpha.pl> writes:
> On 13.07.2009, Rob Wolfe <rw@smsnet.pl> wrote:
>>> ProgrammingError: (ProgrammingError) (1146, "Table 'db.entities_user' doesn't exist") 'DESCRIBE `entities_user`' ()
>> To mi wygląda na problem w samym MySQLdb [1]_.
> Możliwe, ale to mi nie wygląda na przekazywanie obiektu wyjątku jako
> pierwszego argumentu. Jak dla mnie Exception.args jest OK, MySQLdb reaguje
> prawidłowo na próbę zrobienia DESCRIBE na nieistniejącej tabeli, lecz
> Elixir nie przechwytuje tego wyjątku (a raczej przechwytuje jedynie aby
> zrobić ROLLBACK). Mogę jednak się mylić.
>
Z tego co wyczytałem, to w MySQLdb 1.2.3 w Exception.args[0]
jest właśnie obiekt wyjątku, a Elixir oczekuje numeru błędu.
Czyli ten test w Twoim przypadku nie powinien przejść:
<code>
import MySQLdb
c = MySQLdb.connect(user='user', passwd='pass', host='localhost', db='test')
cursor = c.cursor()
try:
cursor.execute('describe some_nonexistent_table')
except MySQLdb.ProgrammingError, e:
print repr(e)
assert e.args[0] == 1146, e.args
</code>
Jeśli to zadziała, to faktycznie nie tu leży problem.
RW
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