Чтение онлайн

на главную - закладки

Жанры

Язык программирования Python
Шрифт:

weekday,

wdname.

Следующий сценарий создаст таблицу в базе данных (в случае с SQLite заботиться о создании базы данных не нужно: файл создастся автоматически. Для других баз данных необходимо перед этим создать базу данных, например, SQL–инструкцией CREATE DATABASE):

Листинг

import sqlite as db

c = db.connect(database=«tvprogram»)

cu = c.cursor

try:

cu.execute("""

CREATE TABLE tv (

tvdate DATE,

tvweekday INTEGER,

tvchannel VARCHAR(30),

tvtime1 TIME,

tvtime2 TIME,

prname VARCHAR(150),

prgenre VARCHAR(40)

);

«"")

except db.DatabaseError, x:

print

«Ошибка: ", x

c.commit

try:

cu.execute("""

CREATE TABLE wd (

weekday INTEGER,

wdname VARCHAR(11)

);

«"")

except db.DatabaseError, x:

print «Ошибка: ", x

c.commit

c.close

Здесь просто исполняются SQL–инструкции, и обрабатывается ошибка базы данных, если таковая случится (например, при попытке создать таблицу с уже существующим именем). Для того чтобы таблицы создавались независимо, используется commit.

Кстати, удалить таблицы из базы данных можно следующим образом:

Листинг

import sqlite as db

c = db.connect(database=«tvprogram»)

cu = c.cursor

try:

cu.execute(""«DROP TABLE tv;""")

except db.DatabaseError, x:

print «Ошибка: ", x

c.commit

try:

cu.execute(""«DROP TABLE wd;""")

except db.DatabaseError, x:

print «Ошибка: ", x

c.commit

c.close

Наполнение базы данных

Теперь можно наполнить таблицы значениями. Следует начать с расшифровки числовых значений для дней недели:

Листинг

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 объекта–курсора использует второй параметр — последовательность — для массового ввода данных с помощью SQL–инструкции INSERT.

Предположим, что телепрограмма задана в файле tv.csv в формате 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 в соответствии с типами переданных значений. SQL–инструкция INSERT была бы некорректной при попытке выполнить подстановку самостоятельно, например, операцией форматирования %.

Выборки из базы данных

Базы данных создаются для удобства хранения и извлечения больших объемов. Следующий нехитрый пример позволяет проверить, правильно ли были введены в таблицу дни недели:

Листинг

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

Если все было сделано правильно, получится:

Листинг

Поделиться:
Популярные книги

Последний Паладин. Том 8

Саваровский Роман
8. Путь Паладина
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Последний Паладин. Том 8

Дракон

Бубела Олег Николаевич
5. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.31
рейтинг книги
Дракон

Дважды одаренный. Том V

Тарс Элиан
5. Дважды одаренный
Фантастика:
аниме
альтернативная история
городское фэнтези
5.00
рейтинг книги
Дважды одаренный. Том V

Ларь

Билик Дмитрий Александрович
10. Бедовый
Фантастика:
городское фэнтези
мистика
5.75
рейтинг книги
Ларь

Газлайтер. Том 17

Володин Григорий Григорьевич
17. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 17

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Адвокат Империи 3

Карелин Сергей Витальевич
3. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Адвокат Империи 3

Князь Андер Арес 5

Грехов Тимофей
5. Андер Арес
Фантастика:
историческое фэнтези
фэнтези
героическая фантастика
5.00
рейтинг книги
Князь Андер Арес 5

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Копиист

Поселягин Владимир Геннадьевич
2. Рунный маг
Фантастика:
фэнтези
7.26
рейтинг книги
Копиист

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Моя простая курортная жизнь 6

Блум М.
6. Моя простая курортная жизнь
Любовные романы:
эро литература
5.00
рейтинг книги
Моя простая курортная жизнь 6

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

На гребне обстоятельств

Шелег Дмитрий Витальевич
7. Живой лед
Фантастика:
фэнтези
5.25
рейтинг книги
На гребне обстоятельств