🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.python
Article #328

Re: mysql + python

#328
From: Adam Buraczewski
Date: Tue, 10 Dec 2002 23:39
41 lines
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-mail
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>

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