🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: addslashes

#249
From: Adam Buraczewski
Date: Fri, 06 Dec 2002 20:39
46 lines
2930 bytes
Ogryzek <slukas5@poczta.onet.pl> wrote:
> Chcialbym wczytywac do bazy mySql stringi zawierajace znaki ' " / \ . Jaka
> funkcja podobna do addslashes w php, bedzie dodawac mi / przed danymi
> znakami.

Nie, to nie tak.  To nie Ty masz wstawiać te backslashe, to interfejs
do baz danych (byle zgodny ze standardem DBI) ma sam zadbać, żeby te
wszystkie backslashe i apostrofy w odpowiednim momencie dodać.  Tylko
trzeba go umieć wykorzystać.  Piszesz np. tak:

	napis = r"Tu napis z apostrofami ', backslashami \ i innymi cudami"

a potem otwierasz połączenie z bazą danych (nie ważne jaką, to może
być MySQL, Oracle, PostgreSQL, albo cokolwiek przez ODBC) i piszesz:

	c = connection.cursor()
	c.execute("insert into tabela values (%s)", napis)	
	c.close()

Zwróć uwagę, że chociaż w poleceniu SQL używa się znaczka %s w miejscu
parametru, to nie używa się operatora %, a dane przekazuje się do
funkcji execute(), która się już nimi zajmuje.  Parametry te są
wewnątrz execute() escape'owane wg reguł odpowiednich dla konkretnej
bazy danych, a o to jakie są te reguły martwi się "sterownik" a nie
Ty.  Ważne jest, że w efekcie do serwera bazodanowego polecenie jest
już wysyłane tak jak byś tego oczekiwał, czyli z argumentami
tekstowymi ujętymi w apostrofy i z backslashami.  A jakby przez ten
przekazywany parametr był równy None, to sterownik sam go zamienia na
NULL.

Przy okazji cały ten jednolity mechanizm pozwala na szybką zmianę
używanego systemu bazodanowego, bez większych zmian w kodzie programu.
Dzięki temu kiedyś napisałem program, który dostawał się do Acessa
przez ODBC, a gdy udało mi się "uwolnić" firmę od tej bazy danych, po
zmianie kilku linijek wszystko pracowało na PostgreSQLu.

Podobnie zrealizowane są sterowniki dostępu do baz danych w innych
językach programowania (Perl, Java), to tylko w PHP zwykle się dużo
samemu manipuluje na napisach :(

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: <6ge7c-8j1.ln1@localhost>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.polbox.pl!not-for-mail
References: <aspn1g$9s1$1@news.onet.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!news.icm.edu.pl!news.polbox.pl!not-for-mail
From: Adam Buraczewski <adamb@polbox.pl>
Newsgroups: pl.comp.lang.python
Subject: Re: addslashes
Date: Fri, 6 Dec 2002 21:39:02 +0100
Organization: TDC Internet Polska S.A.
Lines: 46
Message-ID: <6ge7c-8j1.ln1@localhost>
References: <aspn1g$9s1$1@news.onet.pl>
NNTP-Posting-Host: p35.ppp.polbox.pl
Mime-Version: 1.0
X-Trace: news.polbox.pl 1039207684 27114 213.241.7.35 (6 Dec 2002 20:48:04 GMT)
X-Complaints-To: news@polbox.pl
NNTP-Posting-Date: 6 Dec 2002 20:48:04 GMT
User-Agent: tin/1.5.14-20020926 ("Soil") (UNIX) (Linux/2.4.19 (i686))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit