Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 3, 2008 13:11:54

timas
От:
Зарегистрирован: 2008-08-28
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

В Python еще новичок - всего неделя. Возникла потребность делать много много запросов. Написал класс, упрощающий как мне кажется работу, по крайней мере данные можно одной строчкой получать. Но всех подводных камней я не знаю (еще не успел осознать и понять), может кто-то сразу скажет, что не так, какие могут быть проблемы.

Просто есть подозрение что я закрываю(освобождаю) не все что нужно.

class objMySQL:
def __init__(self, host='localhost', user='root', passwd='', database='intras'):
self.db = MySQLdb.connect(host, user, passwd, database)
self.cursor=self.db.cursor()
self.cursor.execute("SET NAMES utf8")

#Запрос на select
def execute(self, sql):
self.cursor.execute(sql)
return list(self.cursor.fetchall())

#Запрос на колво-записей (count * - первое поле)
def executeScalar(self, sql):
self.cursor.execute(sql)
return self.cursor.fetchone()

#Запрос на INSERT, UPDATE, DELETE, ALTER, DROP, CREATE....
def executeNonQuery(self, sql):
self.cursor.execute(sql)
self.db.commit()
return

def __del__(self):
self.cursor.close()
self.db.close()
Примеры использования:
count=objMySQL().executeScalar("SELECT COUNT(*) FROM adminka_users")

user=objMySQL().execute("SELECT * FROM adminka_users WHERE id='" + iduser + "'")

objMySQL().executeNonQuery("DELETE FROM adminka_user_groups WHERE user_id='" + iduser + "'")



Офлайн

#2 Сен. 3, 2008 13:52:12

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

Велосипед. Еще и данные не эскейпятся. Бери sqlalchemy. Если не нужен orm используй хотя бы sql toolkit



Отредактировано (Сен. 3, 2008 13:53:22)

Офлайн

#3 Сен. 3, 2008 13:53:00

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

Я думаю, использовать уже готовые ORM проще, чем писать велосипед.
А так, вообще, особых проблем с кодом не вижу.

Офлайн

#4 Сен. 3, 2008 14:55:44

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

Я бы не делал метод __del__ - вроде его не рекомендуется юзать без понимания…, ибо сборщик мусора как-то не так как обычно начинает работать в этом месте.
Еще стоит квотить передаваемые запросу параметры.



Офлайн

#5 Сен. 3, 2008 16:01:07

timas
От:
Зарегистрирован: 2008-08-28
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

Насчет ORM, я пока не очень хорошо разбираюсь в моделях у Django, база уже есть и некоторые вещи, например где данные беруться из нескольких таблиц (3-5) или вложенные запросы, я не представляю как делать, так что пока голым SQL проще (для меня). Насчет велосипеда я согласен. За __del__ - спасибо, вообщем то это и хотел узнать. Запросы передаваемые параметру обратываются Django (query|escape, например). Спасибо всем



Офлайн

#6 Сен. 3, 2008 16:10:29

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

надо обрабатывать на запросы, а параметры, подставляемые в запрос.
вот посмотри, сюда: http://wiki.python.org/moin/DbApiFaq
Вот здесь, передаваемые данные автоматически эскейпятся:

>>> cursor.execute("SELECT * FROM my_table WHERE my_column = %s", "column_value")
Причем это стандарт: Python Database API Specification v2.0 (http://www.python.org/dev/peps/pep-0249/)

Это я все к чему: ИМХО лучше передавать в методы execute* параметры в виде отдельное переменной-списка. Чтоб потом можно было их обэскейпить безболезненно.



Отредактировано (Сен. 3, 2008 16:15:39)

Офлайн

#7 Сен. 3, 2008 17:13:54

timas
От:
Зарегистрирован: 2008-08-28
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Укажите недостатки такого подхода

shiza
надо обрабатывать на запросы, а параметры, подставляемые в запрос.
……
Все понял, спасибо.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version