Какие приемы кодирования вы использовали, чтобы не писать больше sql? - PullRequest
7 голосов
/ 04 февраля 2009

Этот вопрос был предложен Киралессой в Какой твой самый полезный трюк с sql, чтобы не писать больше sql? что мне интересно посмотреть, что придет с этим вопросом.

Еще раз, я не удерживаю репутацию от этого вопроса. Я жду ответов 7 дней, затем отмечаю это вики. Репутация, которую заработал вопрос, получает награду за этот вопрос.

Основные правила:

  • Хотя, безусловно, разумно писать код, переносить обработку из SQL в код для решения проблем с производительностью, на самом деле вопрос не в этом. Вопрос не ограничивается проблемами с производительностью. Цель состоит не столько в том, чтобы выполнить работу.

  • Сообщите эту концепцию, чтобы другие пользователи сказали: "Ого, я не знал, что вы можете это сделать".

  • Пример кода очень полезен, чтобы помочь людям, которые в основном изучают зрение.

  • Явно укажите, какой язык вы используете, и какой диалект SQL вы используете.

  • Поставьте себя на место читателей. Что бы им нужно было увидеть прямо на экране перед ними, это вызовет прозрение. Ваш ответ поможет читателю. Напишите это для них.

  • Внешние ссылки в порядке, если они появляются после примера. Внешние ссылки в качестве замены для реального ответа не являются.

Возможно, есть другие вещи, которые делают читателя приятнее, о которых я даже не думал. Будьте креативны. Поделитесь знаниями. Веселитесь, хвастаясь.

[РЕДАКТИРОВАТЬ] - Похоже, что в последнее время не было никакой активности 5 голосов = 50, так что есть награда, и она была wikified.

Ответы [ 11 ]

10 голосов
/ 04 февраля 2009

Если вы хотите избежать написания SQL, используйте ORM, например, nHibernate, или одно из предложений Microsoft Linq to SQL / Entity Framework

Это даже лучше, чем использовать генератор, так как вам не нужно перезапускать генераторы, и если вы используете Fluent nHibernate, вы можете включить конфигурацию через соглашение и даже не поддерживать файл / класс отображения.

2 голосов
/ 11 февраля 2009

Я свернул свой собственный ORL (Object-Relational Mapper) в PHP для MySQL. Это действительно упрощает все, что связано с изменением базы данных, и очень хорошо работает в простых ситуациях.

Он состоит из базового класса, от которого вы можете наследовать. Вы подкласс это легко:

<?php
class CSomething extends CDatabaseObject
{

}

// create a new Something
$oSomething = new CSomething();
$oSomething->somevariable = 'blah';
$oSomething->Save();

// fetch an old Something by primary key
$oSomething = new CSomething(1);
// .. and delete it
$oSomething->Delete();
?>

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

Вы можете выполнить базовый поиск, указав предложение WHERE в SQL (поэтому оно не является полностью свободным от SQL). Поскольку теперь речь идет о типах данных полей, параметризованные запросы просты.

Конечно, он не может делать все, что мне нужно, но он экономит много времени на разработку и код.

2 голосов
/ 04 февраля 2009

Язык: C # / VB.NET.

В настоящее время я могу написать систему с БД без написания какого-либо SQL вообще. Мой DAL использует определения классов POJO для генерации SQL на лету. Пример:

SearchCriteria sc = new SearchCriteria();
sc.AddBinding("Customer_id", "ALFKI");
List<Entity> customers = SQL.Read(sc, new Customers());

Приведенный выше код вернет список экземпляров Customer, соответствующих Customer_id, в значение "ALFKI". DAL подключается к базе данных, создает SQL, выполняет его, создает новые объекты, заполняет их и отправляет обратно. Когда вы закончите менять объекты, просто позвоните

SQL.Write(customer);

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

Добавлен бонус: он поддерживает SQL Server, Oracle, Informix. Код клиента никогда не должен изменяться.

2 голосов
/ 04 февраля 2009

Создание SQL SP, представлений и т. Д. Из метаданных в INFORMATION_SCHEMA. Эта генерация кода может быть дополнена пользовательским кодом.

Если несколько SP будут делать аналогичные вещи, для простоты обслуживания я буду генерировать динамический SQL вместо этого.

Все это приводит к меньшему количеству кода SQL и большему количеству кода, который повторно используется и, таким образом, лучше проверяется - как любая библиотека.

Вот пример генерации кода, чтобы избежать написания SQL

1 голос
/ 11 февраля 2009

В одном из моих проектов я использую метамодель (таблицы, столбцы, отношения), которая добавляет информацию во встроенные представления sys *.

Часть данных в моей метамодели используется для генерации триггеров регистрации для вставки / обновления / удаления, а также для реализации каскадного удаления в триггерах вместо удаления. С ок. 100 таблиц сгенерированный код для этих триггеров составляет около 12.000 строк кода TSQL.

SP генерирует структуру данных C #, которая сравнивает действующую схему базы данных со схемой моей базы данных разработки, чтобы убедиться, что обновления прошли нормально.

Недавно метамодель даже позволила мне сгенерировать код C # для проверки удаления (т.е. не может удалить запись, если существуют зависимые записи) в формах Asp.Net на основе FormView.

1 голос
/ 04 февраля 2009

Там, где я работаю, мы сделали несколько вещей, чтобы уменьшить SQL и уменьшить связанные с этим издержки использования SQL в Java. (Мы запускаем Java с MSSQL, MySQL и Oracle).

Самым полезным приемом является использование метода setObject в Java для привязки параметров. Это, в сочетании с Varargs, позволяет вам написать служебный метод для выполнения SQL:

DBUtil.execSQL(Connection con, String sql, Object... params)

Просто переберите параметры и используйте Statement.setObject (index, param [index-1]). Для нулей вы используете setNull (). Мы расширили эту концепцию для запросов с помощью метода getResultSet; обернутый объект ResultSet также закрывает свой оператор, упрощая управление ресурсами.

Чтобы уменьшить фактический написанный код SQL, у нас есть структура построения запросов, которая позволяет вам указать группу столбцов и их типы, а затем использовать это для автоматического указания критериев поиска и выходных столбцов. Мы можем легко указать объединения и критерии объединения, и это обрабатывает большинство обычных случаев. Преимущество состоит в том, что вы можете сгенерировать отчет примерно из 10 строк кода, включая различные параметры запроса, сортировку, группировку и т. Д. Код слишком сложен, чтобы включать его здесь.

Я также использовал таблицы Oracle ALL_TABLES и ALL_TAB_COLUMNS для генерации операторов SELECT; Еще один прием, который я использовал, - это использование ResultSetMetadata для анализа таблицы:

ResultSet rs = DBUtil.getResultSet(con, "SELECT * FROM " + someTable);
ResultSetMetaData rsm = rs.getMetaData();

boolean first = true;
for (int i = 1; i <= rsm.getColumnCount(); i++) {
  String col = rsm.getColumnName(i).toUpperCase();
  // do something with the column name
}

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

Еще один прием, который мы используем, - это использование констант для всех имен наших таблиц и столбцов. Это делает ввод SQL немного утомительным, но позволяет (помимо прочего) легко генерировать SQL для таблиц с похожей или идентичной конструкцией. Поскольку мы используем константы для определения имен столбцов, код фактически обеспечивает одинаковое имя идентичных столбцов. Использование констант также позволяет вам находить ссылки на определенный столбец, что позволяет вам исследовать другие операторы SQL, которые могут быть связаны с выполняемой вами работой. Это позволяет нам повторно использовать SQL из других модулей, вместо того, чтобы снова слепо переписывать тот же оператор снова.

0 голосов
/ 19 апреля 2009

В SQL нет ничего плохого. Используйте правильный инструмент для правильной работы.

0 голосов
/ 12 февраля 2009

Использование встроенных функций .NET, таких как столбцы выражений (показан пример VB) к данным привязать несколько столбцов для одновременного отображения:

ds.Tables(0).Columns.Add(
    New DataColumn("CustomDescription", GetType(String), 
                   "LastName + ', ' + FirstName + ' - ' + 
                   WorkEmail"))
ResultsListBox.DataSource = ds
ResultsListBox.DataTextField = "CustomDescription"
ResultsListBox.DataValueField = "EmployeeID"
ResultsListBox.DataBind()
0 голосов
/ 11 февраля 2009

Я очень рекомендую SQLAlchemy, если вы можете использовать среду Python.

Другая вещь, которую я попробовал, - это написать собственный генератор схем для тестирования наших систем на работе. Это было больше, чтобы генерировать различные комбинации запросов, чтобы попытаться завершить работу системы. По сути, я определил псевдо-депарсное дерево со словарями и списками

SQLAlchemy

Вот фрагмент кода

>>>for row in session.query(User, User.name).all():
...    print row.User, row.name
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password FROM users []
<User('ed','Ed Jones', 'f8s7ccs')> ed
<User('wendy','Wendy Williams', 'foobar')> wendy
<User('mary','Mary Contrary', 'xxg527')> mary
<User('fred','Fred Flinstone', 'blah')> fred
0 голосов
/ 09 февраля 2009

Я использовал outlet-orm , который является отличным решением ORM, которое не генерирует. Я думаю, что из всех трюков, которые я делал в прошлом, этот был наиболее удобным и экономил время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...