Article View: pl.comp.lang.python
Article #328Re: mysql + python
From: 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?
Technical Details
Message-ID:
<biaic-rp.ln1@adamb.mielonka.polbox.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.man.poznan.pl!news.ipartners.pl!news.polbox.pl!not-for-mailReferences:
<at4cc9$fs7$1@news.onet.pl> <at4mi4$fo6$1@news.tpi.pl> <at50v9$1du$1@news.onet.pl> <slrnavc2d3.jg.gminick@hannibal.localdomain> <at52oi$9i6$1@news.onet.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news.man.poznan.pl!news.ipartners.pl!news.polbox.pl!not-for-mail
From: Adam Buraczewski <adamb@polbox.pl>
Newsgroups: pl.comp.lang.python
Subject: Re: mysql + python
Date: Wed, 11 Dec 2002 00:39:23 +0100
Organization: TDC Internet Polska S.A.
Lines: 41
Message-ID: <biaic-rp.ln1@adamb.mielonka.polbox.pl>
References: <at4cc9$fs7$1@news.onet.pl> <at4mi4$fo6$1@news.tpi.pl> <at50v9$1du$1@news.onet.pl> <slrnavc2d3.jg.gminick@hannibal.localdomain> <at52oi$9i6$1@news.onet.pl>
NNTP-Posting-Host: p173.ppp.polbox.pl
Mime-Version: 1.0
X-Trace: news.polbox.pl 1039566709 11152 213.241.7.173 (11 Dec 2002 00:31:49 GMT)
X-Complaints-To: news@polbox.pl
NNTP-Posting-Date: 11 Dec 2002 00:31:49 GMT
User-Agent: tin/1.5.15-20021115 ("Spiders") (UNIX) (Linux/2.4.19 (i686))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit