Conversation
IlyaOrlov
left a comment
There was a problem hiding this comment.
Есть несколько существенных замечаний, но в целом все прекрасно)
|
|
||
|
|
||
| base = MySQLite("MyDataBase.db") | ||
| with base: |
There was a problem hiding this comment.
Стоит объединить строки 122 и 123 (with MySQLite("MyDataBase.db") as base:), чтоб кто-нибудь не рискнул по случайности, вставить между ними код, переопределяющий переменную base для каких-то своих целей.
| print("Выбор непонятен") | ||
|
|
||
| def my_execute(self, s): | ||
| if not self.proverka(s, ["INSERT", "UPDATE", "DELETE"]): |
There was a problem hiding this comment.
Здесь и в стр.60: под неизменяемый набор команд, к которому мы применяем операцию in лучше другой тип данных использовать, не список!
И вообще этот набор команд стоит сделать константным атрибутом класса.
| self._path = path | ||
| self._name_table = None | ||
|
|
||
| # Методы my_execute_values, enter, exit и все методы связанные с ними были написаны мной до того как я задал Вам вопрос. |
There was a problem hiding this comment.
enter и exit - нужны, т.к. в задании требовался менеджер контекста.
Что касается my_execute_values, choice_tabl (да и exit в какой-то мере) - мне в них категорически не нравится ввод данных. Только представьте, как писать автотесты к таким методам!
Ввод данных в подавляющем большинстве случаев стоит отделять от обработки этих данных. Это разные задачи. Можно запрашивать данные в основном коде, в отдельных функциях и затем передавать в методы класса в качестве параметров.
| self._path = path | ||
| self._name_table = None | ||
|
|
||
| # Методы my_execute_values, enter, exit и все методы связанные с ними были написаны мной до того как я задал Вам вопрос. |
There was a problem hiding this comment.
enter и exit - нужны, т.к. в задании требовался менеджер контекста.
Что касается my_execute_values, choice_tabl (да и exit в какой-то мере) - мне в них категорически не нравится ввод данных. Только представьте, как писать автотесты к таким методам!
Ввод данных в подавляющем большинстве случаев стоит отделять от обработки этих данных. Это разные задачи. Можно запрашивать данные в основном коде, в отдельных функциях и затем передавать в методы класса в качестве параметров.
| value = input(f"Введите значение для столбца {i}") | ||
| values.append(value) | ||
| values = tuple(values) | ||
| self._database.execute(f"INSERT INTO {self._name_table}{str(columns)}VALUES {str(values)}") |
|
|
||
|
|
||
| base = MyDB("MyData.db") | ||
| with base: |
There was a problem hiding this comment.
Строки 88 и 89 стоит объединить.
| base.company_product() | ||
| print("=================================================") | ||
| print(f"Товары небыли куплены: {base.not_bought()}") | ||
| pass |
| def __enter__(self): | ||
| self._database = sqlite3.connect(self._path) | ||
| self._cur = self._database.cursor() | ||
| self._create_db() |
There was a problem hiding this comment.
Код, изменяющий структуру БД (DDL) всё-таки стоит держать отдельно от DML. И уж точно не стоит его вызывать безусловно.
Понятно, что это демонстрационное решение, но даже в нем стоит соблюдать такое требование, чтоб, если что, было легко сделать его рабочим.
Лекция 13. Прошу прощения, опять намудрил с кодом в задании 1. Показательные методы my_execute и my_select. Остальные, не связанные с ними, лучше даже не смотрите :D
В задании 1, решил наполнять табличку через метод класса, просто было удобно так во время разработки. Приемлемо ли подобное или лучше так никогда не делать?