LINUX.ORG.RU

Canonical открывает в свободный доступ один из компонентов Launchpad


0

0

9 июля Canonical Ltd. (коммерческий спонсор дистрибутива Ubuntu GNU/Linux) в своем официальном пресс-релизе сообщила о выходе одного из компонентов системы Launchpad в открытый доступ.

Этим компонентом стало средство для коммуникация (object-relational mapper (ORM)) с БД написанное на языке Python под названием "Storm". Основной задачей данного модуля является упрощение разработки программных комплексов на языке Python взаимодействующих со множеством БД.

В качестве лицензии была выбрана GNU LGPL v2.1. Сайт проекта: https://storm.canonical.com/

>>> Пресс-релиз



Проверено: Shaman007 ()
Ответ на: комментарий от ChALkeR

>>Фигли не 3?

А фигли должны?

Тебе халяву дали - а ты еще и претензии предъявляешь.

Lockywolf
()
Ответ на: комментарий от Sikon

>Мда. То откроем, то не откроем...

По-моему, они всегда говорили, что откроют. Просто код кривоват пока --- причёсывают.

Davidov
()

Это не нужно. Есть SQLAlchemy.

anonymous
()

Это чтоб SQL не учить?

cab
()

чет не нашел, какие бд знает... или ему без разницы,лишь бы бинд был?

Deleted
()
Ответ на: комментарий от Davidov

> А кто может сказать, как оно в сравнении с sqlobject?

sqlobject - говно. вы еще это не поняли? все проекты, использующие sqlobject, перешли/переходят на sqlalchemy.

anonymous
()
Ответ на: комментарий от cab

> Это чтоб SQL не учить? Непонятна сама идея объектного подхода к работе с БД.

Просто ты тупенький. Это, во-первых, позволяет абстрагироваться от особенностей БД - ваша программа может работать с любой поддерживаемой БД, об этом позаботится ОРМ. Во-вторых, это позволяет работать с БД на том языке, на котором ведется вся остальная разработка, что освобождает васм от постоянного "переключения контекстов" с SQL на Python, что в свою очередь способствует повышению продуктивности, и минимизирует вероятность появления ошибок.

anonymous
()
Ответ на: комментарий от cab

>Это чтоб SQL не учить? Непонятна сама идея объектного подхода к работе с БД.

Нет, это что бы проще разрабатывать приложения, работающие с реляционными бд, на обьектно-ориентированном языке программирования.

anonymous
()

Пока в браузере язык не сменил - на сайте херь какая-то.

anonymous
()
Ответ на: комментарий от anonymous

> Подскажите плз, это примерно для тех же целей, что и DBI для перла?

Чушь. Для тех же целей в питоне db-api. Это совсем другое.

anonymous
()

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

anonymous
()
Ответ на: комментарий от anonymous

> кто выпустил перловика из дома престарелых?!

Я думал последнего из них заспиртовали в 2003.

anonymous
()
Ответ на: комментарий от anonymous

>> Это чтоб SQL не учить? Непонятна сама идея объектного подхода к работе с БД.

> Просто ты тупенький. Это, во-первых, позволяет абстрагироваться от особенностей БД - ваша программа может работать с любой поддерживаемой БД, об этом позаботится ОРМ. Во-вторых, это позволяет работать с БД на том языке, на котором ведется вся остальная разработка, что освобождает васм от постоянного "переключения контекстов" с SQL на Python, что в свою очередь способствует повышению продуктивности, и минимизирует вероятность появления ошибок.

Зависит от области применения. У нас для транзакций подобная фигня не используется. Тормозит и отлаживать тяжело. Проблемы с использованием SQL не вижу.

anonymous
()
Ответ на: комментарий от anonymous

Lol, не оправдывайся быдлокодер, всем понятно что ты даже обычных библиотек абстракции на бд не потянул

anonymous
()
Ответ на: комментарий от anonymous

Библиотеки абстракции к БД - зло.

Каждая база уникальна (к сожалению), поэтому для ускорения работы используются свои фичи (хинты у оракла, хитрые запросы в фаербёрд для обхода кривизны его планировщика и т.д.)

А еще один ODBC на хрен не нужен. В нормальных проектах абстракции и так встроенные и для перехода на новую БД (что кстати редко происходит) просто переписывается слой работы с БД (или используется другая библиотека).

А так - в топку ...

sur02111976
()
Ответ на: комментарий от anonymous

Значит у вас именно херня. Что удобнее?
c=conn.cursor()
c.execute('select f,i,o from employers where birthday=now()')
for row in c.fetchall():
         e = employet(f=row[0],i=row[1],o=row[2])
         e.message('С днем рождения')
Или
for e in e.objects.get(birthday=now()):
            e.message('С днем рождения')

anonymous
()
Ответ на: комментарий от sur02111976

Пипец сколько умных... Причем тут ODBC? Причем тут фичи SQL??? Некоторые ORM мапперы даже позволяют передать им SQL... Мля народ ни в зуб нагой и лезет в бутылку. вопли из серии Нафиг самолет он большой - ходите пешком.

anonymous
()
Ответ на: комментарий от anonymous

SQLAlchemy наше все!

Вообще ORM удобны когда не охота возится со sql, и не нужны фичи какой-то конкретной БД...

anonymous
()
Ответ на: комментарий от anonymous

> for e in e.objects.get(birthday=now()):
e.message('С днем рождения')

Или select = Test1.select(EXISTS(Select(Test2.q.col2, where=(Outer(Test1).q.col1 == Test2.q.col2)))) - не знаю кого как, а у меня начинаются рвотные позывы от таких вот извращений. И еще от эффективности того SELECT-а, который оно нагенерит. И если такие конструкции все время использовать, то никакая оптимизация тебе не поможет.

> Это, во-первых, позволяет абстрагироваться от особенностей БД - ваша программа может работать с любой поддерживаемой БД, об этом позаботится ОРМ.

1) Это тогда, когда стоит бизнес-задача - обеспечить поддержку максимального числа БД. Эта задача, в некотором приближении, выполнима, но надо понимать, каким гемором это дается.
2) БД разные, их возможности разные, сложность SQL разная. Надо выбрать БД исходя из условий задачи и использовать возможности БД на полную катушку.
3) ОО подход здесь сбоку припеку. Не ложится БД на ООП-нутый подход.

cab
()

API выглядит приятно. Правда, доки мало, и непонятно, как они разруливают всякие select ... for update, и как в многонитевом веб-приложении работать с несколькими Store. В SQLAlchemy приходится делать session_context.current.clear()...

adarovsky
()
Ответ на: комментарий от cab

Так никто и не требует использовать ORM для задач типа увеличить колонку в таблице на 1. ОРМ нужен когда объект надолго поднят из БД и с ним выполняется множество операцию Часто его свойства суть ссылки к другим таблицам. Вот там застрелиться хочется когда надо пол сотни полей в объект и из объекта.... А насчет оптимизации SQL - все эти жалобы похожи на крики - давайте перепишем все на ассемблере? Часто ORM выдает куда более эффективный код чем программист которого уже достало в 1001 раз за день мапить колонки из и в SQL

anonymous
()
Ответ на: комментарий от anonymous

> Lol, не оправдывайся быдлокодер, всем понятно что ты даже обычных библиотек абстракции на бд не потянул

Ну протестровали мы парочку ORM. Там когда 15 таблиц мапятца, Perl код какой-то получается, а не вызов. Так что мы лучше по-старинке. SQL код читается легко. А умным кодерам желаю успехов в освоении. Ещё можно обращения к базе данных на XML писАть, советую умникам тоже обязательно внедрить в свои программы.

anonymous
()
Ответ на: комментарий от cab

> select = Test1.select(EXISTS(Select(Test2.q.col2, where=(Outer(Test1).q.col1 == Test2.q.col2))))

Perl? LISP? У меня 1000 связанных таблиц в базе. Чур меня, чур...

anonymous
()
Ответ на: комментарий от anonymous

python, под Лисп я такого не встречал, да и ООП-щиной там мало кто увлекается.

> Чур меня, чур...

От и я о чем ;)

cab
()
Ответ на: комментарий от anonymous

> Ну протестровали мы парочку ORM. Там когда 15 таблиц мапятца, Perl код какой-то получается, а не вызов.

Ну так не используйте!

ОРМ - он для удобства. В основном используется в несложных приложениях типа вебни.

Если у вас прилада сильно завязана на базу и постоянно случаются хитрые тяжёлые запросы с массой джойнов - лысый SQL вам навстречу.

yk4ever
()
Ответ на: комментарий от yk4ever

Странные люди - не пользовали но ругаем...
def ord_close(request,ord_id):
	"""Закрытие заказа"""
	params=request.GET
	o = OrderHead.objects.get(pk=ord_id)
	o.stClosed=True;
	o.closeDate=datetime.datetime.now()
	o.save()
	return HttpResponseRedirect('/'+site_root+'/ordedit/?id='+ord_id)
В принципе с SQL по количеству строк похоже (за исключением SQL ejection)

def ord_close(request,ord_id):
	"""Закрытие заказа"""
	params=request.GET
        SQL = "update orders set stClose=True, closeDate=now() where id=%s" % int(ord_id)
        c = conn.cursor()
        c.execute(SQL)
	return HttpResponseRedirect('/'+site_root+'/ordedit/?id='+ord_id)

По количеству строк похоже - но сверху читсый питон. а снизу колбаса...

anonymous
()
Ответ на: комментарий от anonymous

Кстати уже ошибку сделал... надо вместо

SQL = "update orders set stClose=True, closeDate=now() where id=%s" % int(ord_id)

писать

SQL = "update orders set stClose=True, closeDate=now() where id=%i" % int(ord_id)

anonymous
()
Ответ на: комментарий от cab

> Это для CL, но не для Scheme.

Причем тут схема, ты говорил именно про лисп.

В схеме нет стандартной библиотеки для ООП, о каком ОРМе может идти речь.

anonymous
()
Ответ на: комментарий от anonymous

> SQL = "update orders set stClose=True, closeDate=now() where id=%i" % int(ord_id)

господи, эти деятели даже используя dbapi умудряются параметры в запросы вдалбливать! вот уж правду говорят, что кривого только могила исправит.

anonymous
()
Ответ на: комментарий от anonymous

вот поэтому и пользую ОРМ, что для SQL приходится вспоминать что SQL не строка. Кстати для умника (12.07.2007 2:25:31) Нука составь строчку INSERT с использованием DB-API с заранее не известным количеством колонок (например копирование таблицы в таблицу В РАЗНЫХ БД). (Для простоты считаем, что все состоит из строк)

SQL = "INSERT INTO %s ( %s ) VALUES (" % (dest_table, string.join(columns,','))
dest = dconn.cursor()
for row in src.fetchall():
dest.execute(SQL+"%s);" % string.join(list(row),',')))
dest.commit()
--------------------
А вот поди сделай такое без % а только с DB-API (только apply применять).
В итоге если ты DB используешь 5% времени и знаешь про существование paramstyle греха тут нет

anonymous
()
Ответ на: комментарий от anonymous

> Причем тут схема, ты говорил именно про лисп.

А с каких пор схема не лисп?

cab
()
Ответ на: комментарий от anonymous

>(например копирование таблицы в таблицу В РАЗНЫХ БД)

Лично я бы написал bash script который бы утилитой базы вытакскивал нужную таблицу в dump, а затем также всасывал утилитой в другую базу..

anonymous
()
Ответ на: комментарий от anonymous

> Нука составь строчку INSERT с использованием DB-API с заранее не известным количеством колонок (например копирование таблицы в таблицу В РАЗНЫХ БД)

слабо представляю себе ситуацию, когда такое необходимо.

> dest.execute(SQL+"%s);" % string.join(list(row),',')))

классических пример sql-injection, даже ни смотря на то, что работать просто не будет - string.join(...,',') должно быть ','.join(...) и значения надо в кавычках слать, если уж ты сам все собираешь, что есть большое зло. а еще надо тогда вручную все значения экранировать. а если там не строки, а, к примеру, юникод или None, то ты вообще попал. не убедил еще?

placeholder = '?' statement = 'insert into %s (%s) values (%s)' % (table, ','.join(columns), ','.join(placeholder * len(columns)) cursor.execute(statement, row)

опять же, это только демонстрация того, как правильно использовать execute. на практике подобные фокусы с динамическими именами таблиц и полей - явный признак плохого дизайна.

anonymous
()
Ответ на: комментарий от anonymous

вобщем убедил.. только всеравно с ОРМ удобнее чем без него... там вообще насчет таких вещей не думаешь. и не думаешь строка это или SQL

anonymous
()
Ответ на: комментарий от anonymous

> только всеравно с ОРМ удобнее чем без него... там вообще насчет таких вещей не думаешь. и не думаешь строка это или SQL

разве я против orm что-то сказал? все, что я сказал - это то, что не надо лепить запросы вручную, а оставить подстановку параметров и пр. рутину для execute(). помимо всего прочего, многие реализации умеют компилировать такие шаблоны и использовать их повторно.

с orm надо тоже уметь не переборщить. зачастую, вместо простого "update something set val=val+? where id=?", грузят объект, меняют значение, затем сохраняют.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.