🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: bazy danyc odbc

#283
From: Adam Buraczewski
Date: Sun, 08 Dec 2002 00:21
113 lines
4837 bytes
K507 <spam@nie.pl> wrote:
> Szukam jaki? materia??w najlepiej po polsku :)
> kt?re by w przyst?pny spos?b opisywa?y korzystanie
> z baz danych g??wnie ale nie tylko ODBC pod Pythonem
> I og?lnie tworzenia pod nim aplikacji bazodanowych

OK, spróbuję opisać.  Ogólna recepta postępowania:

1. Musisz zdobyć specyfikację DBI 2.0 ze strony:

	http://www.python.org/topics/database/

Ten dokument opisuje jak mają się zachowywać wszystkie sterowniki do
baz danych, większość autorów sterowników respektuje te zalecenia.
Przeczytaj to, naucz się, w wielu przypadkach nie znajdziesz lepszej
dokumentacji.

2. Musisz zdobyć pakiet egenix-mx-base ze strony:

	http://www.lemburg.com/files/python/

i go zainstalować.  Warto, bo jest ciekawy i wiele sterowników DBI
z niego korzysta.  Pakiet ten jest bezpłatny, nawet do celów
komercyjnych.

3. Musisz zdobyć sterownik do odpowiedniej bazy danych, spora lista
jest pod adresem z pkt. 1, oraz na stronie:

	http://www.vex.net/parnassus/

Jeżeli chcesz ODBC, to najlepszy możliwy sterownik (mxODBC) jest pod
adresem z pkt. 2, ale do celów komercyjnych jest płatny.  Oczywiście
musisz wszystko zainstalować.  Jeżeli możesz, używaj raczej
specjalizowanych sterowników do konkretnych baz danych, będziesz mógł
wtedy z nich wyciągnąć więcej ciekawych możliwości, których windowsowy
mechanizm ODBC nie oferuje.

4. W programie musisz najpierw "zaimportować" odpowiedni sterownik
DBI, na przykład tak:

	import modul_ze_sterownikiem as DBI

Oczywiście zamiast modul_ze_sterownikiem musisz wpisać faktyczną nazwę
sterownika DBI, którego używasz.  Potem musisz nawiązać połączenie:

	connection = DBI.connect(parametry)

W powyższej linijce trzeba podać odpowiednie parametry, w zależności
od sterownika: nazwę bazy danych, adres komputera, nazwę użytkownika,
hasło itp.  Dla ODBC wystarczy podać nazwę DSN (czy jak to tam się
nazywa pod Windows).  Po szczegóły odsyłam do dokumentacji.

Do realizacji właściwych zapytań musisz stworzyć sobie tzw. kursory,
których może być zwykle więcej niż 1 równocześnie:

	cursor1 = connection.cursor()
	cursor2 = connection.cursor()

Potem wysyłasz do bazy zapytanie:

	cursor1.execute("select kol1, kol2 from tabela")

i odczytujesz odpowiedzi:

	while 1:
		row = cursor1.fetchone()
		if row is None: break
		kol1 = row[0]
		kol2 = row[1]
		# Jakieś dalsze przetwarzanie danych.

Odczytuje się, jak widać, za pomocą funkcji fetchone(), która zwraca
wiersz wyniku w postaci tablicy, albo None jak już wszystkie dane są
odczytane.  Możesz użyć fetchall(), która to funkcja odczyta od razu
całą tabelę i zrobi z niej tablicę tablic.

Jeżeli w wierszu wyniku są wartości NULL, to sterownik automatycznie
zamienia je na None.

Kursory możesz używać wielokrotnie.  Jeżeli chcesz przekazać jakieś
parametry, to robisz to tak:

	cursor2.execute("""
		select * from tabela
		where pole1 = %s and pole2 = %s
	""", parametr1, parametr2)

Podane parametry zostaną wstawione zamiast znaczków "%s".  Jeżeli
parametrem jest None, to zostanie zamieniony na NULL.  Jeżeli jest
łańcuchem tekstu, to zostanie ujęty w apostrofy, a wszystkie znaki
specjalne zostaną poprzedzone backslashem itp.  Trzeba podać tyle
parametrów ile jest znaczków "%s", to oczywiste.  Acha, należy podawać
zawsze %s, niezależnie czy parametr jest łańcuchem tekstu czy liczbą.

Po użyciu kursor można zamknąć:

	cursor1.close()
	cursor2.close()

i rozłączyć się od bazy danych:

	connection.close()

Proste? :)  Zauważ, że niezależnie od użytej bazy danych dostęp jest
właściwie taki sam.  Jedynie to co wysyła się jako parametr execute()
musi być zgodne z tym co konkretna baza danych akceptuje.

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: <1tfac-rlf.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: <astvbr$bld$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: bazy danyc odbc
Date: Sun, 8 Dec 2002 01:21:21 +0100
Organization: TDC Internet Polska S.A.
Lines: 113
Message-ID: <1tfac-rlf.ln1@localhost>
References: <astvbr$bld$1@news.onet.pl>
NNTP-Posting-Host: p223.ppp.polbox.pl
Mime-Version: 1.0
X-Trace: news.polbox.pl 1039307113 18414 213.241.7.223 (8 Dec 2002 00:25:13 GMT)
X-Complaints-To: news@polbox.pl
NNTP-Posting-Date: 8 Dec 2002 00:25:13 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