Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
104-155.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
122.82 Кб
Скачать

Деректер қорын толтыру

Енді кестелерді мәндермен толтыруға болады. Апта күндері үшін сандық мәндерді шифрлаудан бастаған жөн:

weekdays = ["Жексенбі", "Дүйсенбі", "Сейсенбі", "Сәрсенбі",

"Бейсенбі", "Жұма", "Сенбі", "Жексенбі"]

import sqlite as db

c = db.connect(database="tvprogram")

cu = c.cursor()

cu.execute("""DELETE FROM wd;""")

cu.executemany("""INSERT INTO wd VALUES (%s, %s);""",

enumerate(weekdays))

c.commit()

c.close()

Ескере кететіні, enumerate() кірістірілген функция нөмер-мән тізімін құрады, мысалы:

>>> print [i for i in enumerate(['a', 'b', 'c'])]

[(0, 'a'), (1, 'b'), (2, 'c')]

Келтірілген мысалдан executemany() обьект-курсорының әдісі екінші параметр – INSERT SQL-нұсқаулығының көмегімен жаппай деректерді енгізу үшін – тізбектілік қолданылатыны түсінікті.

Айталық, телебағдарлама CSV форматындағы tv.csv файылында берілген (ол талқыланып қойылған):

10.02.2003 9.00|ОРТ|Новости|Новости|9.15

10.02.2003 9.15|ОРТ|"НЕЖНЫЙ ЯД"|Сериал|10.15

10.02.2003 10.15|ОРТ|"Маски-шоу"|Юмористическая программа|10.45

10.02.2003 10.45|ОРТ|"Человек и закон"||11.30

10.02.2003 11.30|ОРТ|"НОВЫЕ ПРИКЛЮЧЕНИЯ СИНДБАДА"|Сериал|12.00

Келесі бағдарлама CSV-файылын талқылайды және tv кестесіне деректерді жазады:

import calendar, csv

import sqlite as db

from sqlite.main import Time, Date ## Только для

db.Date, db.Time = Date, Time ## sqlite

c = db.connect(database="tvprogram")

cu = c.cursor()

input_file = open("tv.csv", "rb")

rdr = csv.DictReader(input_file,

fieldnames=['begt', 'channel', 'prname', 'prgenre',

'endt'])

for rec in rdr:

bd, bt = rec['begt'].split()

bdd, bdm, bdy = map(int, bd.split('.'))

bth, btm = map(int, bt.split('.'))

eth, etm = map(int, rec['endt'].split('.'))

rec['wd'] = calendar.weekday(bdy, bdm, bdd)

rec['begd'] = db.Date(bdy, bdm, bdd)

rec['begt'] = db.Time(bth, btm, 0)

rec['endt'] = db.Time(eth, etm, 0)

cu.execute("""INSERT INTO tv

(tvdate, tvweekday, tvchannel, tvtime1, tvtime2, prname,

prgenre)

VALUES (

%(begd)s, %(wd)s, %(channel)s, %(begt)s, %(endt)s,

%(prname)s, %(prgenre)s);""", rec)

input_file.close()

c.commit()

Түрлендірудің үлкен бөлігі күн және уақыттың алынуымен байланысты (жолдарды күн және уақыт форматымен сәйкесінше бөліктерге бөлуге тура келеді ). Апта күні calendar модуліндегі функция көмегімен алынды.

Ескерту:

Кішігірім қателік үшін sqlite пакетінде Date, Time және т.б. конструкторлар, sqlite.main модуліндегі sqlite-дегі импорты кезінде, тимиді, сондықтан екі жол қосуға тура келді: sqlite үшін спецификалық , әмбебапқа db атымен берілген модуль.

Сол мысалда деректер қорынның кестесіне мәндерді қою үшін сөздіктерді қолдану көрсетілген болатын. Ескере кететіні, қою, жіберілген мәндердің түрімен сәйкесінше, execute() шақыруының ішінде орындалады. INSERT SQL-нұсқаулығы қоюды өзбетінше орындау кезінде орынсыз болар еді, мысалы, % форматтау операциясында.

Деректер қорынан таңдау

Деректер қоыр сақтау қолайлығы үшін және үлкен көлемдерді шығару үшін құрылады. Келесі мысал апта күндері кестеге дұрыс енгізілгенін тексеріге мүмкіндік береді:

import sqlite as db

c = db.connect(database="tvprogram")

cu = c.cursor()

cu.execute("SELECT weekday, wdname FROM wd ORDER BY weekday;")

for i, n in cu.fetchall():

print i, n

Егер бәрі дұрыс болса, нәтижесі:

0 Жексенбі

1 Дүйсенбі

2 Сейсенбі

3 Сәрсенбі

4 Бейсенбі

5 Жұма

6 Сенбі

7 Жексенбі

Телебағдарламаны таңдауды қалай жасағанын аңғару қиын емес:

import sqlite as db

c = db.connect(database="tvprogram")

cu = c.cursor()

cu.execute("""

SELECT tvdate, tvtime1, wd.wdname, tvchannel, prname, prgenre

FROM tv, wd

WHERE wd.weekday = tvweekday

ORDER BY tvdate, tvtime1;""")

for rec in cu.fetchall():

dt = rec[0] + rec[1]

weekday = rec[2]

channel = rec[3]

name = rec[4]

genre = rec[5]

print "%s, %02i.%02i.%04i %s %02i:%02i %s (%s)" % (

weekday, dt.day, dt.month, dt.year, channel,

dt.hour, dt.minute, name, genre)

Бұл мысалда күн және уақыт үшін түр ретінде mx.DateTime-дегі түр қолданылады. Осы себептен атрибутқа жүгінуге жыл, ай, күн, сағат және минутты алу мүмкін болды. Айтпақшы, datetime – datetime стандартты модулінің обьекті дәл сондай атрибуттарға ие. Жалпы жағдайда, күн және уақыт үшін басқа түр қолданылуы мүмкін, сондықтан егер қордан алынған күндер терең өңделуден өтетін болса, онда бірден сұрау бойынша алынғаннан кейін оларды ішкі көрсетілімге аудару керек. Осыдан DB-API модуліндегі күн түрі бағдарламаның басқа бөліктеріне әсер етпейді.

Басқа ДҚБЖ және Python

sqlite модулі кішігірім және тез деректер қоры үшін керемет мүмкіндіктер береді, дегенмен баяндалудың толықтығы үшін, басқа ДҚБЖ үшін, Python кеңейтілімінің модулдеріне шолу ұсынылады.

Жоғарыда барлық жерде sqlite модулі, оның атауы db-ға өзгеруімен берілген, импортталды. Бұл кездейсоқ жасалмаған. Мәселесінде, DB-API 2.0 қолдайтын мұндай модулдер, басқа ДҚБЖ үшінде бар, және тіпті жалғыз емес. www.python.org DB-API 2.0 сайтындағы ақпаратқа сәйкес – Python үшін үйлесімді модулдер ДҚБЖ немесе ДҚ-на қолжетімділік хаттамаларына келесілері ие:

  • zxJDBC. JDBC бойынща қолжетімділік.

  • MySQL. ДҚБЖ MySQL үшін.

  • mxODBC. ODBC бойынша қолжетімділік, eGenix фирмасымен сатылымда (http://www.egenix.com).

  • DCOracle2, cx_Oracle. ДҚБЖ Oracle үшін.

  • PyGresQL, psycopg, pyPgSQL. PostgreSQL ДҚБЖ үшін.

  • Sybase. Sybase үшін.

  • sapdbapi. ДҚБЖ SAP үшін.

  • KinterbasDB. ДҚБЖ Firebird үшін (бұл Interbase мұрагері).

  • PyADO. Microsoft ActiveX Data Objects-не адаптер (тек Windows бойынша ).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]