Skip to content

Kharin b#93

Open
Tetrackon wants to merge 3 commits into
mainfrom
Kharin_B
Open

Kharin b#93
Tetrackon wants to merge 3 commits into
mainfrom
Kharin_B

Conversation

@Tetrackon
Copy link
Copy Markdown
Collaborator

Лекция 13. Прошу прощения, опять намудрил с кодом в задании 1. Показательные методы my_execute и my_select. Остальные, не связанные с ними, лучше даже не смотрите :D

В задании 1, решил наполнять табличку через метод класса, просто было удобно так во время разработки. Приемлемо ли подобное или лучше так никогда не делать?

Copy link
Copy Markdown
Owner

@IlyaOrlov IlyaOrlov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Есть несколько существенных замечаний, но в целом все прекрасно)



base = MySQLite("MyDataBase.db")
with base:
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Стоит объединить строки 122 и 123 (with MySQLite("MyDataBase.db") as base:), чтоб кто-нибудь не рискнул по случайности, вставить между ними код, переопределяющий переменную base для каких-то своих целей.

print("Выбор непонятен")

def my_execute(self, s):
if not self.proverka(s, ["INSERT", "UPDATE", "DELETE"]):
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь и в стр.60: под неизменяемый набор команд, к которому мы применяем операцию in лучше другой тип данных использовать, не список!
И вообще этот набор команд стоит сделать константным атрибутом класса.

self._path = path
self._name_table = None

# Методы my_execute_values, enter, exit и все методы связанные с ними были написаны мной до того как я задал Вам вопрос.
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

enter и exit - нужны, т.к. в задании требовался менеджер контекста.
Что касается my_execute_values, choice_tabl (да и exit в какой-то мере) - мне в них категорически не нравится ввод данных. Только представьте, как писать автотесты к таким методам!
Ввод данных в подавляющем большинстве случаев стоит отделять от обработки этих данных. Это разные задачи. Можно запрашивать данные в основном коде, в отдельных функциях и затем передавать в методы класса в качестве параметров.

self._path = path
self._name_table = None

# Методы my_execute_values, enter, exit и все методы связанные с ними были написаны мной до того как я задал Вам вопрос.
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)}")
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код уязвим для SQL-инъекций.



base = MyDB("MyData.db")
with base:
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Строки 88 и 89 стоит объединить.

base.company_product()
print("=================================================")
print(f"Товары небыли куплены: {base.not_bought()}")
pass
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pass лишний

def __enter__(self):
self._database = sqlite3.connect(self._path)
self._cur = self._database.cursor()
self._create_db()
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Код, изменяющий структуру БД (DDL) всё-таки стоит держать отдельно от DML. И уж точно не стоит его вызывать безусловно.
Понятно, что это демонстрационное решение, но даже в нем стоит соблюдать такое требование, чтоб, если что, было легко сделать его рабочим.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants