[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [ngodb] Co teraz robić?
From: |
Radoslaw Janeczko |
Subject: |
Re: [ngodb] Co teraz robić? |
Date: |
Wed, 23 Feb 2005 12:32:06 +0100 |
User-agent: |
Mozilla Thunderbird 1.0 (X11/20041227) |
By the day 02/23/2005 11:05 AM, fellow named Piotr Szmigielski wrote:
3. Jak ma wyglądać uaktualnianie / synchronizacja danych pomiędzy
węzłami (trzeba się nad tym ostro zastanowic, gdyż przyjęty
mechanizm może mieć duży wpływ na strukturę bazy danych)
To jest odrębna sprawa. Synchronizacja powinna być odrębnym
procesem, opartym
o zawnętrzne narzędzia lub dodatkowe moduły aplikacji. W tym
momencie zostawmy
ją na później.
System moze być odrębny, ale dane umozliwiające synchronizację myszą
(?) być zawarte w samej bazie danych, a to ma wpływ na strukturę...
Tak samego mechanizmu wymyślać od razu nie trzeba, ale dość ciężko
będzie dołączyć ją później
Naszym celem jest taki stan, w którym aplikacja kliencka nic nie wie o
synchronizacji. Wszelkie mechanizmy synchronizujące muszą działać w sposób
przezroczysty, albo jako zewnętrzne narzędzia, albo moduł, który wepniemy w
logikę. Będzie to wymagało jedynie dodania dodatkowych wywołań funkcji, które
nie wpłyną na działanie aplikacji.
W tej chwili nie wiemy nawet, czy synchronizacja będzie odbywać się na
poziomie bazy danych (np. wierszy tabeli), czy warstwy logicznej aplikacji
(np. przesyłanie obiektów typu 'osoba')...
poza tym, jęsli całość miałby być napisana w tym dziwnym, wężowym
języku ;) to musiałbym dostać najprostszy przykładowy plik np.
łączący się z bazą danych (nie jestem pewien, czy mam ochotę
przechodzic cały tutorial do pythona)
W tutorialu Pythona nie znajdziesz info o łączeniu z bazą :( Na szczęście
większość pythonowych API bazodanowych zgodna jest ze specyfikacją DBAPI2:
http://www.python.org/peps/pep-0249.html
Przykładowy driver dla SQLite: http://pysqlite.org
Pierwszy krok zależy od danego drivera. Kilka przykładów:
1. SQLite
<code>
import sqlite
con = sqlite.connect("db")
</code>
2. MySQL
<code>
import MySQLdb
con = MySQLdb.connect(host="localhost", user="user", passwd="passwd", db="db")
</code>
3. PostgreSQL
<code>
from pyPgSQL import PgSQL
con = PgSQL.connect(host="host",database="db",user="login",password="passwd")
</code>
To daje nam obiekt połączenia. Jeśli baza obsługuje transakcje, autocommit
standardowo jest wyłączony.
Kolejne kroki są już podobne dla wszystkich baz danych. Całościowy przykład
dla SQLite:
<code>
import sqlite
con = sqlite.connect("db")
cur = con.cursor()
cur.execute("SELECT imie, nazwisko FROM osoba")
while True:
row = cur.fetchone()
if row == None:
break
print "%s %s" % (row[1], row[0])
</code>
Powyższe wyciągnie wszystkie wiersze z tabelki 'osoba' i wypisze je na ekran.
Z INSERT i UPDATE postępujemy podobnie:
<code>
cur.execute("INSERT INTO osoba (imie, nazwisko) VALUES ('Ala', 'Kot')")
</code>
Jeśli chcemy użyć prepared statement (BARDZO przyspiesza hurtowe operacje), w
zapytaniu umieszczamy symbol parametru dla wartości kolumny, zależnego od
danego drivera. Obowiązujący styl nazewnictwa wyciągniemy ze stałej
'paramstyle' danego drivera, np.:
>>> print sqlite.paramstyle
pyformat
co oznacza, że możemy używać standardowego formatowania Pythona:
<code>
cur.execute("INSERT INTO osoba (imie, nazwisko) VALUES (%s, %s)",
(imie, nazwisko))
</code>
albo:
<code>
cur.execute("INSERT INTO osoba (imie, nazwisko) VALUES (%(imie)s, %(nazw)s)",
{"imie": imie, "nazw": nazwisko})
</code>
mam nadzieję, że pomoże :)
pozdrawiam
--
Radoslaw Janeczko
Software Developer, GTS Polska
e-mail: address@hidden