🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#26365
Author: Daniel Mróz
Date: Mon, 13 Jul 2009 13:51
42 lines
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
#26366
Author: Rob Wolfe
Date: Mon, 13 Jul 2009 21:01
50 lines
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
#26369
Author: Daniel Mróz
Date: Tue, 14 Jul 2009 17:01
16 lines
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
#26367
Author: Daniel Mróz
Date: Tue, 14 Jul 2009 17:20
34 lines
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
#26368
Author: Rob Wolfe
Date: Tue, 14 Jul 2009 19:32
31 lines
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