Re[5]: Зачем нужен ORM?
От: koodeer  
Дата: 13.10.18 15:00
Оценка:
Здравствуйте, Titus, Вы писали:

... where true


Этого условия вообще не должно быть.

T>Ты понял смысл трех строчек, что я написал?


Понял. Это не избавляет от ручного написания кода, от склейки строк.

T>Любые условия нужно написать и хранить, хоть в таблице, хоть в коде.

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

Да, но это же ручная работа, от которой ORM избавляет.


T>Что-то я не упомню, что параметризованные запросы сильно просаживали производительность. Даже, сколько-нибудь просаживали...


Да, но эти параметры должны быть прописаны в зависимости от условий. Получаем либо много склеек строк и сложность в поддерживании, либо что-то наподобие
AND (CustomerID = @custid OR @custid IS NULL)

А это просадка производительности. Или необходимость recompile.

PS. Я вовсе не ратую за ORM. Будь моя воля, я бы вообще на ассемблере все писал. Я лишь упомянул о некоторых (больших) плюсах, которые может дать ORM (linq-подобная).
Re[5]: Зачем нужен ORM?
От: Danchik Украина  
Дата: 13.10.18 16:06
Оценка: +3
Здравствуйте, Titus, Вы писали:

T>Здравствуйте, koodeer, Вы писали:


K>>Например, задано условие: выбрать из таблицы всех с возрастом больше 42. В запрос должно добавиться where. Если этого условия нет, в запрос ничего не добавляется. Уже два варианта sql.

T>как тебе такое Илон Маск:
T>
T>... where true
T>


K>>Задано словие выбрать всех с именем Bob. Еще два варианта sql. Перемножаем с первым условием: итого 4 варианта.

T>Ты понял смысл трех строчек, что я написал?

T>>> Сами условия можно хранить и менять в администрируемой таблице.

K>>То есть их нужно писать, хранить, поддерживать. Нельзя на лету добавить новое условие.
T>Любые условия нужно написать и хранить, хоть в таблице, хоть в коде.
T>В моем варианте условия хранятся в таблице, чтобы их менять редактирование кода и компиляция не нужны.

Какой-то кошмар, где-то я такое уже видел. Рука приблизилась к лицу. Хотя всякое бывает.

K>>>>Сделать динамический sql — пожертвовать производительностью.

T>>>что ты имеешь в виду?
K>>Имею в виду вот это.

T>Что-то я не упомню, что параметризованные запросы сильно просаживали производительность. Даже, сколько-нибудь просаживали...


Бывает, SQL Server, может построить план запроса по первому вызову и потом следующие вызовы будет ганять по нему. Иногда это критично и только заинлайнив параметры, именно в том случае, мы получили необходимую скорость.

Переставайте нам рассказывать про склейку строк и техники ее применения. Трудно поддерживать, SQL injections, плохая декомпозиция запросов. Качество запросов проседает — одна надежда на оптимизатор базы данных, который как в случае с MySql отвратительный.

Я не клеил SQL из строк, уже лет 10, чего и вам желаю. Просто выберите свой инструмент. Хотя похоже вы какой-то склейщик и написали. Таких тоже вагон и тележка, поищите по github.
Re[6]: Зачем нужен ORM?
От: Titus  
Дата: 14.10.18 08:00
Оценка: -1 :)
Здравствуйте, Danchik, Вы писали:

D>Переставайте нам рассказывать про склейку строк и техники ее применения. Трудно поддерживать, SQL injections, плохая декомпозиция запросов.


А можно поподробнее?
Поддержка — это исправление ошибок, т.е. приведение функционала в соответствие с эксплуатационной документацией.
Развитие — это добавление или изменение функционала и изменение эксплуатационной документации.
Сложности возникают, когда алгоритмы функционала по многократно дублируются в программе. Т.е. программа не соответствует парадигме структурного программирования.
Какое отношение к этому имеет склейка строк?

Или ссылку какую дайте на на более менее уважаемый источник, где четко и, желательно, подробно написано, что склейка строк — очень плохой стильпрограммирования.
Желательно, чтобы источник был столь же уважаем, как и, например, один из авторов парадигмы структурного программирования, Дейкстра, который где-то в 70-х говорил,
что после ознакомления студентами с оператором goto в бейсике, эти студенты не в состоянии понять преимущества структурного программирования,
а уж тем более взять на вооружение парадигму структурного программирования.
Хотя, это он, конечно, "перегибал палку".

Потому что просто утверждение о том, что строковые sql запросы поддерживать сложнее, чем linq запросы требует доказательства.

Далее, что касается SQL injections, то ORM не гарантирует 100% защиты от них.

Отсюда: https://www.hacksplaining.com/prevention/sql-injection

...the next best approach is to ensure proper escaping of special string characters in input parameters.

Using an ORM does not automatically make you immune to SQL injection, however.



D>Качество запросов проседает — одна надежда на оптимизатор базы данных

Как напишешь, такое и качество.

D>Я не клеил SQL из строк, уже лет 10, чего и вам желаю. Просто выберите свой инструмент. Хотя похоже вы какой-то склейщик и написали. Таких тоже вагон и тележка, поищите по github.


Зачем мне искать то, что и так есть. Вот понять, зачем нужен ORM применительно к моим задачам — интересно.
Тот же linq2db действительно неплохо генерит классовое отображение структуры БД в c#. Проверил, работает. Но такая генерилка у меня уже есть. Занимает меньше 100 строчек в коде.

Кстати, я в linq2db ожидал увидеть и автоматически сгенерированные CRUD методы, но увидел только поиск записи по ID-шнику.


То, что linq2db скорей всего, упростит одновременную работу многими разношерстными источниками — возможно. Как будет задача — проверю. Такие задачи периодически появляются.
Re[7]: Зачем нужен ORM?
От: itslave СССР  
Дата: 14.10.18 13:33
Оценка:
Здравствуйте, Titus, Вы писали:

T>Потому что просто утверждение о том, что строковые sql запросы поддерживать сложнее, чем linq запросы требует доказательства.


Я выше приводил конкретные примеры. Еще раз и коротко: типизированные linq запросы во первых поддерживаются современными средами разработки(включая автоматический рефакторинг), во вторых — ошибки выдаются на этапе компиляции, в отличии от этапа выполнения для sql запросов.

T>Тот же linq2db действительно неплохо генерит классовое отображение структуры БД в c#. Проверил, работает. Но такая генерилка у меня уже есть. Занимает меньше 100 строчек в коде.


Спасибо, поржал от души.
Re[7]: Зачем нужен ORM?
От: Danchik Украина  
Дата: 14.10.18 13:39
Оценка: +1
Здравствуйте, Titus, Вы писали:

[Пока проскипано]

T>Кстати, я в linq2db ожидал увидеть и автоматически сгенерированные CRUD методы, но увидел только поиск записи по ID-шнику.


Зачем эти методы генерить? Они есть в библиотеке. Я и генерацию этих Find отключаю — бесполезные.
Вот милое видео об CRUD операциях https://youtu.be/m--oX73EGeQ


T>То, что linq2db скорей всего, упростит одновременную работу многими разношерстными источниками — возможно. Как будет задача — проверю. Такие задачи периодически появляются.


Linq2db меняет сам подход к написанию приложений. Tы начинаешь думать не обьектами, а запросами к обьектам.
Кину гипотетически пример. Писано на айпаде, могут быть ошибки.

Вот пишем такую вот функцию, сложность практически не ограничена, и скорее всего будет обрастать новыми условиями.
IQueryable<Users> GetCompromisedUsers(DataConnection db)
{
   return from u in db.GetTable<User>()
      where db.GetTable<CompromisedConnections>.Any(c => c.UserId == u.UserId)
      select u;
}


Просто собираем айдишники
var ids = GetCompromisedUsers(db).Select(u => u.UserId).ToArray();


Пробуем разные способы деактивации
var query = from u in GetCompromisedUsers(db)
    from b in db.GetTable<Billing>().LeftJoin(b => b.UserId == u.UserId)
    select new { User = u, Billing = b };
// Simple shows how query can be tunelled across objects
var compromisedAndPaidNotEnough = from q in query
   where Sql.ToNullable(q.Billing.Amount) ?? 0 < 100
   select q.User;

// Deactivate users
compromisedAndPaidNotEnough
  .Set(u => u.Deatctivated, true)
  .Set(u => u.DeactivatedOn, u => Sql.CurrentTimesatmp)
  .Set(u => u.DeactivatedCount, u => u.DeactivatedCount + 1)
  .Update();

// Insert into another table 
compromisedAndPaidNotEnough.Insert(db.GetTable<Users>.TableName(“DeletedUsers”), u => u); 

// Delete them
compromisedAndPaidNotEnough.Delete();


Надеюсь вы поймете сколько запросов я только что написал на коленке и сколько строк прилось бы склеить, да и проверить это все дело. Тут linq2db гарантирует создание правильного запроса. Ну и конечно оно будет работать на дюжине баз данных учитывая их диалекты.
Re[7]: Зачем нужен ORM?
От: IT Россия linq2db.com
Дата: 14.10.18 18:46
Оценка:
Здравствуйте, Titus, Вы писали:

T>Тот же linq2db действительно неплохо генерит классовое отображение структуры БД в c#. Проверил, работает. Но такая генерилка у меня уже есть. Занимает меньше 100 строчек в коде.


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

T>Кстати, я в linq2db ожидал увидеть и автоматически сгенерированные CRUD методы, но увидел только поиск записи по ID-шнику.


В генерации нет необходимости. Есть дженерик методы типа:

db.Insert(myObject);


Что касается генерации Find, то лично я им никогда не пользовался, но кто-то когда-то попросил. А необходимость именно генерации только в том, чтобы правильно сгенерировать параметры, которые соответствую PK.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Зачем нужен ORM?
От: IT Россия linq2db.com
Дата: 14.10.18 19:30
Оценка:
Здравствуйте, itslave, Вы писали:

I>В случае ОРМ надо просто сделать отдельную модель для юзкейсов с фото. Старый функционал трогать не надо и он будет работать как надо — запросы строятся динамически и правильно.


Тоже извратство. Нужно просто было фоточки положить в отдельную таблицу.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Зачем нужен ORM?
От: itslave СССР  
Дата: 15.10.18 11:47
Оценка:
Здравствуйте, IT, Вы писали:

IT>Тоже извратство. Нужно просто было фоточки положить в отдельную таблицу.

В ентерпрайзе всякие чудеса бывают, вплоть до получения специальных разрешений на добавление таблиц.
Re[5]: Зачем нужен ORM?
От: Слава  
Дата: 15.10.18 13:19
Оценка:
Здравствуйте, itslave, Вы писали:

IT>>Тоже извратство. Нужно просто было фоточки положить в отдельную таблицу.

I>В ентерпрайзе всякие чудеса бывают, вплоть до получения специальных разрешений на добавление таблиц.

Причём письменных.
Re[5]: Зачем нужен ORM?
От: IT Россия linq2db.com
Дата: 15.10.18 14:02
Оценка: :)
Здравствуйте, itslave, Вы писали:

IT>>Тоже извратство. Нужно просто было фоточки положить в отдельную таблицу.

I>В ентерпрайзе всякие чудеса бывают, вплоть до получения специальных разрешений на добавление таблиц.

Это как раз то случай, когда нужно получать.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Зачем нужен ORM?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.10.18 15:07
Оценка:
Здравствуйте, Titus, Вы писали:


K>>Странно, что никто не привел (или я пропустил, т. к. не все сообщения просмотрел) классический пример, где ORM заруливает (конкретно LINQ).

K>>
K>>IQueryable<SomeEntity> query = db.SomeEntities;

K>>if (someCondition1)
K>>    query = query.Where(...);

K>>if (someCondition2)
K>>    query = query.Where(...);
K>>


K>>Ручное написание sql при двух условиях потребует четырех вариантов кода. При трех условиях — восьми, при четырех — шестнадцати и т. д. Поддерживать такой sql — мрак.

T>Интересная арифметика. Давай я напишу, как это делается врукопашную.
T>
T>string sqlWhere=GetWhere(conditionID);
T>string sql="select blablabla from x3 where " + sqlWhere;
T>PopulateMyDbContext(sql);
T>


T>количество строчек кода=3 при любом количестве условий. Сами условия можно хранить и менять в администрируемой таблице.


Это некорректный пример. У тебя жосцко забит паттерн 'select...where', соответственно в подклеиваемой части сильно не развернешься.
if (someCondition1)
    query = query.Where(...);

Вот здесь у нас может, внезапно, может нарисоваться джойн в зависимости от параметра этого Where. То есть, структура запроса меняется.

Что бы поддержать такое руками, надо запилить наколеночный ПроцессорСклеиванияСтрок
Re[3]: Зачем нужен ORM?
От: anton_t Россия  
Дата: 18.10.18 17:38
Оценка:
Здравствуйте, Titus, Вы писали:

K>>Ручное написание sql при двух условиях потребует четырех вариантов кода. При трех условиях — восьми, при четырех — шестнадцати и т. д. Поддерживать такой sql — мрак.

T>Интересная арифметика. Давай я напишу, как это делается врукопашную.
T>
T>string sqlWhere=GetWhere(conditionID);
T>string sql="select blablabla from x3 where " + sqlWhere;
T>PopulateMyDbContext(sql);
T>


T>количество строчек кода=3 при любом количестве условий. Сами условия можно хранить и менять в администрируемой таблице.


Здравствуй, sql-injection.
Re[4]: Зачем нужен ORM?
От: Titus  
Дата: 18.10.18 20:02
Оценка: -3 :)
Здравствуйте, anton_t, Вы писали:

_>Здравствуй, sql-injection.


Я уже писал (точнее приводил цитату уважаемых знатоков на англицком) выше, что
1) ORM не гарантирует защиты от sql-injection
2) Для защиты от sql-injection нужно использовать экранирование.
Re[7]: Зачем нужен ORM?
От: Max Mustermann  
Дата: 19.10.18 08:19
Оценка: +1
Здравствуйте, Titus, Вы писали:

Послушайте, но это же какой-то... позор.(с)

T>Или ссылку какую дайте на на более менее уважаемый источник, где четко и, желательно, подробно написано, что склейка строк — очень плохой стильпрограммирования.

Вообще это довольно очевидно, но я не об этом. Довольно смешно то, что вот вся ваша статья ниже — это прямой рассказ где "четко и подробно рассказано, что склейка строк — очень плохой стильпрограммирования".

T>Отсюда: https://www.hacksplaining.com/prevention/sql-injection

T>

T>...the next best approach is to ensure proper escaping of special string characters in input parameters.
T>Using an ORM does not automatically make you immune to SQL injection, however.


Рукалицо. Вы дошли до момента как "ORM не обеспечивает" и просто сломались на этом.
Немного более полная цитата:

Using an ORM does not automatically make you immune to SQL injection, however. Many ORM frameworks allow you to construct SQL statements, or fragments of SQL statements, when more complex operations need to be performed on the database. For example, the following Ruby code is vulnerable to injection attacks:

def current_user(email)
  # This code would be vulnerable to a maliciously crafted email parameter.
  User.where("email = '" + email + "'")
end

As a general rule of thumb: if you find yourself writing SQL statements by concatenating strings, think very carefully about what you are doing.


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

А вот если не выкручивать ORM руки подобным то... то тогда всё сведёстя к вполне безопасным параметризованым запросам и/или дёрганью хранимок/sql функций/.. и такой подход польностью защищает от sql inection.
Re[5]: Зачем нужен ORM?
От: Danchik Украина  
Дата: 19.10.18 10:47
Оценка: +1
Здравствуйте, Titus, Вы писали:

T>Здравствуйте, anton_t, Вы писали:


_>>Здравствуй, sql-injection.


T>Я уже писал (точнее приводил цитату уважаемых знатоков на англицком) выше, что

T>1) ORM не гарантирует защиты от sql-injection
T>2) Для защиты от sql-injection нужно использовать экранирование.

Ну пипец, как это не гарантирует? Вы хоть читали ту статью или просто выдергиваете фразы? Там в основном недо-ORM обсираются типа Ruby on Rails и его ActiveRecord.

The code samples below illustrate good and bad practices when trying to protect against SQL injection.
...
// LINQ will ensure safe passing of parameters.


Экранированием ой как занимаемся, не всегда можно вызвать какую-то конструкцию только на параметрах. Из свежего SqlCe (еще не умер), не поддерживает параметры при вызовах встроенных функций — вперед литералы генерить.
Re[6]: Зачем нужен ORM?
От: Titus  
Дата: 19.10.18 16:06
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Экранированием ой как занимаемся, не всегда можно вызвать какую-то конструкцию только на параметрах.

Ну вот и я о том же. Не только SqlCE, еще и у Microsoft Access (тоже еще жив и даже занимает 6 позицию в "DB-Engines Ranking of Relational DBMS") не всегда параметры работают.

D>Там в основном недо-ORM обсираются типа Ruby on Rails и его ActiveRecord.

И еще, чисто теоретически... не допускаете, что ошибки могут быть и в ORM (даже без префикса недо-)?
Re[7]: Зачем нужен ORM?
От: Danchik Украина  
Дата: 20.10.18 10:55
Оценка:
Здравствуйте, Titus, Вы писали:

T>Здравствуйте, Danchik, Вы писали:


D>>Экранированием ой как занимаемся, не всегда можно вызвать какую-то конструкцию только на параметрах.

T>Ну вот и я о том же. Не только SqlCE, еще и у Microsoft Access (тоже еще жив и даже занимает 6 позицию в "DB-Engines Ranking of Relational DBMS") не всегда параметры работают.

D>>Там в основном недо-ORM обсираются типа Ruby on Rails и его ActiveRecord.

T>И еще, чисто теоретически... не допускаете, что ошибки могут быть и в ORM (даже без префикса недо-)?

Для этого, и не только, у нас ганяются более 90К тестов.
Re[8]: Зачем нужен ORM?
От: Аlexey  
Дата: 31.10.18 17:55
Оценка:
Здравствуйте, Danchik, Вы писали:

T>>То, что linq2db скорей всего, упростит одновременную работу многими разношерстными источниками — возможно. Как будет задача — проверю. Такие задачи периодически появляются.


D>Linq2db меняет сам подход к написанию приложений. Tы начинаешь думать не обьектами, а запросами к обьектам.


Согласен. Например в последнем проекте центральные понятия выражены всего несколькими linq2db запросами. А уже поверх них строятся запросы выборки отдельных элементов, списков, агрегации статистики, фильтрации, причем фильтры могут быть по присоедененным таблицам/запросам. Даже не хочется думать как это выглядело бы при использовании ручной склейки sql строк.
Re[5]: Зачем нужен ORM?
От: Аlexey  
Дата: 31.10.18 17:57
Оценка:
Здравствуйте, Titus, Вы писали:

T>Я уже писал (точнее приводил цитату уважаемых знатоков на англицком) выше, что

T>1) ORM не гарантирует защиты от sql-injection
T>2) Для защиты от sql-injection нужно использовать экранирование.

А можно пример кода того как можно устроить sql-injection с использованием вменяемого ORM, например linq2db?
Re[6]: Зачем нужен ORM?
От: Titus  
Дата: 01.11.18 07:07
Оценка:
Здравствуйте, Аlexey, Вы писали:
А>А можно пример кода того как можно устроить sql-injection с использованием вменяемого ORM, например linq2db?
Я не хакер, просто цитату оставил.
Но, готов получить от вас "пример кода того как можно устроить sql-injection с использованием" экранирования и склейки строк.

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