Thread View: pl.comp.lang.python
10 messages
10 total messages
Started by Ogryzek
Tue, 10 Dec 2002 09:28
mysql + python
Author: Ogryzek
Date: Tue, 10 Dec 2002 09:28
Date: Tue, 10 Dec 2002 09:28
12 lines
1254 bytes
1254 bytes
Witam
Mam taki skrypt
max_id = "select max(id) from pub"
max_id_cursor = db.cursor()
max_id_cursor.execute(max_id)
result = max_id_cursor.fetchall()
i tutaj zaczynaja sie schody. Chcialbym wyciagac ta jedna wartosc i dodawac
1. Probowalem juz roznych sposobow, ale nie moge sie dobrac do tej wartosci.
Za wszelkie sugestie z gory dzieki
Pozdrawiam
Lukasz Slowik alias Ogryzek
Re: mysql + python
Author: Adam Przybyla
Date: Tue, 10 Dec 2002 12:26
Date: Tue, 10 Dec 2002 12:26
13 lines
1371 bytes
1371 bytes
Ogryzek <slukas5@poczta.onet.pl> wrote: > Witam > Mam taki skrypt > max_id = "select max(id) from pub" > max_id_cursor = db.cursor() > max_id_cursor.execute(max_id) > result = max_id_cursor.fetchall() > i tutaj zaczynaja sie schody. Chcialbym wyciagac ta jedna wartosc i dodawac > 1. Probowalem juz roznych sposobow, ale nie moge sie dobrac do tej wartosci. > Za wszelkie sugestie z gory dzieki prosciarstwo: int(result[0][0]) Z powazaniem Adam Przybyla
Re: mysql + python
Author: Ogryzek
Date: Tue, 10 Dec 2002 15:20
Date: Tue, 10 Dec 2002 15:20
8 lines
1230 bytes
1230 bytes
> > i tutaj zaczynaja sie schody. Chcialbym wyciagac ta jedna wartosc i dodawac > > 1. Probowalem juz roznych sposobow, ale nie moge sie dobrac do tej wartosci. > > Za wszelkie sugestie z gory dzieki > prosciarstwo: int(result[0][0]) przy czyms takim wyrzuca mi blad: object can't be converted to int
Re: mysql + python
Author: Wojtek Walczak
Date: Tue, 10 Dec 2002 15:34
Date: Tue, 10 Dec 2002 15:34
10 lines
1325 bytes
1325 bytes
Dnia Tue, 10 Dec 2002 16:20:36 +0100, Ogryzek napisał(a): >> > Za wszelkie sugestie z gory dzieki >> prosciarstwo: int(result[0][0]) > przy czyms takim wyrzuca mi blad: object can't be converted to int A co jest w result[0][0] ? Zrob print i zobacz, z czego starasz sie zrobic liczbe. -- [ ] gminick (at) underground.org.pl http://gminick.linuxsecurity.pl/ [ ] [ "Po prostu lubie poranna samotnosc, bo wtedy kawa smakuje najlepiej." ]
Re: mysql + python
Author: Ogryzek
Date: Tue, 10 Dec 2002 15:51
Date: Tue, 10 Dec 2002 15:51
25 lines
1800 bytes
1800 bytes
Zrobilem tak
maxQuery = "select max(pmid) from pub_authors"
try:
maxQuery_cursor = db.cursor()
maxQuery_wyniki = maxQuery_cursor.execute(maxQuery)
idRow = maxQuery_cursor.fetchone()
highid = idRow[0]
self.nextid = highid + 1
except:
self.nextid = 0
if not self.nextid:
self.nextid = 1
i to pieknie dziala
ale gdy wstawiam wartosc self.nextid do wyrazenia sql to wyrzuca mi blad:
illegal argument type for built-in operatio
a wyrazenie wyglada tak:
sqlstr = "insert into pub_auhtors values('"+self.nextid+"')"
probowalem konwertowac self.nextid na int, czyli int(self.nextid) ale to nie
pomaga, i jestem juz glupi co tu trzeba zrobic zeby to zadzialalo.
Pozdrawiam
Lukasz Slowik alias Ogryzek
Re: mysql + python
Author: Wojtek Walczak
Date: Tue, 10 Dec 2002 15:59
Date: Tue, 10 Dec 2002 15:59
19 lines
1703 bytes
1703 bytes
Dnia Tue, 10 Dec 2002 16:51:09 +0100, Ogryzek napisał(a):
> sqlstr = "insert into pub_auhtors values('"+self.nextid+"')"
sqlstr = "insert into pub_auhtors values(%d)" % (self.nextid)
albo
sqlstr = "insert into pub_auhtors values(" + str(self.nextid) + ")"
ale pierwsze zdecydowanie ladniejsze.
> probowalem konwertowac self.nextid na int, czyli int(self.nextid) ale to nie
> pomaga, i jestem juz glupi co tu trzeba zrobic zeby to zadzialalo.
Musisz to konwertowac na string, czyli str(self.nextid) a nie na liczbe,
liczba to to jest przed konwersja.
--
[ ] gminick (at) underground.org.pl http://gminick.linuxsecurity.pl/ [ ]
[ "Po prostu lubie poranna samotnosc, bo wtedy kawa smakuje najlepiej." ]
Re: mysql + python
Author: Adam Przybyla
Date: Tue, 10 Dec 2002 16:02
Date: Tue, 10 Dec 2002 16:02
41 lines
2347 bytes
2347 bytes
Ogryzek <slukas5@poczta.onet.pl> wrote:
> Zrobilem tak
> maxQuery = "select max(pmid) from pub_authors"
> try:
> maxQuery_cursor = db.cursor()
> maxQuery_wyniki = maxQuery_cursor.execute(maxQuery)
> idRow = maxQuery_cursor.fetchone()
> highid = idRow[0]
> self.nextid = highid + 1
> except:
> self.nextid = 0
> if not self.nextid:
> self.nextid = 1
> i to pieknie dziala
> ale gdy wstawiam wartosc self.nextid do wyrazenia sql to wyrzuca mi blad:
> illegal argument type for built-in operatio
> a wyrazenie wyglada tak:
> sqlstr = "insert into pub_auhtors values('"+self.nextid+"')"
> probowalem konwertowac self.nextid na int, czyli int(self.nextid) ale to nie
> pomaga, i jestem juz glupi co tu trzeba zrobic zeby to zadzialalo.
... ja mialem kursor.fetchall() i z tego wychodzilo cos w stylu:
((1345L,),)
jak sciagasz jednego, to mozesz miec co innego. Moj kod:
[root@castle root]# python1.5 test.py
3034
((3034L,),)
[root@castle root]# cat test.py
import MySQLdb
zapytanie='select max(klucz) from baza'
db=MySQLdb.connect(host='localhost',db='baza',user='juzer',passwd='haszlo')
c= db.cursor()
c.execute(zapytanie)
results = c.fetchall()
print int(results[0][0])
print results
Z powazaniem
Adam Przybyla
Re: mysql + python
Author: Jarek Zgoda
Date: Tue, 10 Dec 2002 21:13
Date: Tue, 10 Dec 2002 21:13
17 lines
1539 bytes
1539 bytes
Dnia Tue, 10 Dec 2002 15:59:50 +0000 (UTC)
Wojtek Walczak <gminick@hacker.pl> pisze:
> > sqlstr = "insert into pub_auhtors values('"+self.nextid+"')"
>
> sqlstr = "insert into pub_auhtors values(%d)" % (self.nextid)
A nie czasem:
sqlstr = "insert into pub_auhtors values(%d)" % (self.nextid, )
Mój 2.2.1 wymaga tam podania krotki...
--
~$ rm -f /bin/Laden
I po kłopocie!
--
Serwis Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: mysql + python
Author: Adam Przybyla
Date: Tue, 10 Dec 2002 22:15
Date: Tue, 10 Dec 2002 22:15
13 lines
1583 bytes
1583 bytes
Jarek Zgoda <jzgoda@usun.gazeta.pl> wrote:
> Dnia Tue, 10 Dec 2002 15:59:50 +0000 (UTC)
> Wojtek Walczak <gminick@hacker.pl> pisze:
>> > sqlstr = "insert into pub_auhtors values('"+self.nextid+"')"
>>
>> sqlstr = "insert into pub_auhtors values(%d)" % (self.nextid)
> A nie czasem:
> sqlstr = "insert into pub_auhtors values(%d)" % (self.nextid, )
> Mój 2.2.1 wymaga tam podania krotki...
... mam 2.2.2 i nie potrzebuje. Z powazaniem
Adam Przybyla
Re: mysql + python
Author: Adam Buraczewski
Date: Tue, 10 Dec 2002 23:39
Date: Tue, 10 Dec 2002 23:39
41 lines
3023 bytes
3023 bytes
Ogryzek <slukas5@poczta.onet.pl> wrote:
> maxQuery = "select max(pmid) from pub_authors"
[...]
> maxQuery_wyniki = maxQuery_cursor.execute(maxQuery)
> idRow = maxQuery_cursor.fetchone()
> highid = idRow[0]
> self.nextid = highid + 1
[...]
> sqlstr = "insert into pub_auhtors values('"+self.nextid+"')"
Ojojoj :) Robisz tu dwa błędy. Jeden, poważniejszy, to próba
nadawania unikalnych identyfikatorów poprzez liczenie max(), dodawanie
1 i używanie tego jako nowego identyfikatora. To nie ma prawa działać
w środowisku wielozadaniowym, wyobraź sobie np. że jeden klient bazy
robi max(), w tym samym czasie inny też robi max(). Potem pierwszy
dodaje 1 do policzonego wcześniej maksimum, drugi robi to samo i jak
wpisują nowy wiersz, to pierwszemu wyjdzie, a drugi będzie próbował
wstawić wiersz z tym samym identyfikatorem! Każda baza danych ma coś
typu autonumer, generator albo sekwencja (różnie się to nazywa ale
idea podobna) i Ty się już nie martwisz o unikalne identyfikatory, to
jest już robota bazy danych. Ty tylko wstawiasz wiersze, a kolumna z
identyfikatorem wypełnia się sama. W MySQL akurat jest autonumer.
Druga sprawa, to przekazywanie parametrów do execute(). Nie wiem, jak
w sterowniku do MySQL, ale generalnie powinieneś robić tak:
cursor.execute("insert into pub_authors values (%s)", self.nextid)
Tu obowiązuje ta sama zasada co w mojej odpowiedzi na twój list w
innym wątku: niech sterownik sam sie zatroszczy o konwersję danej do
odpowiedniego formatu, dodania apostrofów, backslashowania jeśli to
będzie potrzebne itp. i wstawienia do odpowiedniego miejsca zapytania.
Daj mu szansę się wykazać! :) I przeczytaj specyfikację DBI 2.0 pod
kątem parametrów zapytań SQL, jeżeli tego jeszcze nie zrobiłeś...
Pozdrawiam!
--
Adam Buraczewski <adamb@polbox.pl> * Linux registered user #165585
GCS/TW 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?
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