[Python] Databases
Здравейте, вчерашната лекция свързана с бази данни в питон ми беше много интересна, както и в някой аспекти сложна, защото до момента все още не съм имал допир до бази данни. Понеже докато лектора обясняваше за foreign ключа между двете таблици, аз бях вглъбен да направя втората задача и изпуснах някои части от обясненията. Това, което разбрах, е че в таблицата "sale", където реално са продажбите ние трябва да направим колона "catalog_id", която ще се свърза с другата таблица "catalog" или по-конректно с нейната колонка "id", която е primary key и съдържа уникални INTEGER стойности. Следователно, когато импортирам данни в таблицата "sale" аз трябва да правя заявка към таблицата "catalog" като от нея да взимам id-то на артикула със съвпадащ item_key, и после това id да го импортвам в таблицата "sale" в колоната catalog_id. И всъщност това е връзката между двете таблици. Предполагам не го обясних много добре затова поставям кода на двете импортиращи функции, ако може някой по-запознат да ги прегледа и каже дали има пропуски някъде.
# IMPORTING THE CATALOG INTO DB
def import_catalog_into_db(catalog_by_item_id, connection):
cursor = connection.cursor()
for catalog_entry in catalog_by_item_id.values():
cursor.execute(
"insert into catalog (item_key, category) values (?, ?)",
[catalog_entry.item_id, catalog_entry.category_name]
)
#IMPORTING THE SALES INTO DB
def import_sales_into_db(sales, connection):
cursor = connection.cursor()
for sale in sales:
cursor.execute('SELECT id FROM CATALOG where item_key = ?', [sale.item_id])
result = cursor.fetchone()
cursor.execute("""
insert or replace into sale (catalog_id, country, city_name, sale_timestamp, price) values (?, ?, ?, ?, ?)
""", [result[0], sale.country, sale.city, sale.sale_timestamp, float(sale.price)])
След пускане на програмата и когато заредя базата данни през sqlitestudio, ми изглежда сякаш всичко е наред. Но за да тръгне програмата трябва предварително да съм изтрил базата данни, иначе ми дава следния ексепшън:
File "/home/supersane/Development/softuni/Python/databases/sqlite_import.py", line 58, in import_catalog_into_db
[catalog_entry.item_id, catalog_entry.category_name]
sqlite3.IntegrityError: UNIQUE constraint failed: catalog.item_key
Това, което предполагам, е че във функцията, където импортирам каталога, insert, трябва да го заменя също с insert or replace, но честно казано не съм сигурен дали това е правилния метод и дали от един проблем няма да си създам още няколко. Ще се радвам на някакво съдействие от ваша страна, благодаря.
Благодаря за изчерпателния отговор @RoYaL, в метода за импортиране сложих също insert or replace и сега работи без ексепшъна. За проверката, която ми каза не се бях сетил. Сега ми идва въпроса, ако result е празен, какво е редно да направим? Да пропуснем нищо да импортваме или да сложим някаква стойност, като индикация, че нещо не е наред? Как би било по-добре?
Със сигурност не е добра идея да слагаш нещо в базата. Или поне не в тази таблица. Може да индикираш на стандартния аутпут, че нещо не е наред. Спомняш ли си от първите лекции - логера? Другият вариант е да направиш таблица за логване на различни събития (обикновено се прави в друга база данни), където да отбележиш, че поради някаква причина има продажба на несъществуващ артикул, така че примерно в края на отчетния период да се види кой е този продавач, дето успява да продава нещо, дето го нямате във вашата мрежа, например :))
Благодаря за предложението, това с допълнителната база данни ми допада доста, но май май ме домързя да го реализирам затова добавих следното:
Няма нужда сам да си крафтваш логването във файлове.
https://docs.python.org/2/howto/logging.html
Виж секцията "Logging to a file"
Един страничен въпрос. Къде може човек да намери кодовете от лекцията на решените задачи? В таковата не намирам нищо.
След всяка лекция на дадената задача, след нея има секция "Насоки" - погледни там. Ако не намираш нещо пиши във форума, все ще има някой да ти даде решения на задачите. :)