SQL для обработки обновлений таблиц «динамически типизированным» способом - PullRequest
0 голосов
/ 26 августа 2010

Я играю с модулем Python 3 sqlite3 и знакомлюсь с SQL в процессе.

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

def store(table, data, database=':memory:')

Может вызываться как, например, store('logins', {'username': 'bob', 'salt': 'foo', 'salted_hash' : 'bar'}), и иметь возможность индивидуально добавлять в logins, в новую строку, значение bob для username, foo для salt и т. Д.

К сожалению, я завален тем, какой SQL кодировать. Я пытаюсь сделать это «динамически типизированным» способом, так как я не буду наказан за хранение неправильных типов или за возможность добавлять новые столбцы, например, по желанию.

Я хочу, чтобы функция очищала весь ввод:

  • Проверьте, существует ли таблица, и создайте ее, если она не существует, с переданными ключами из словаря в качестве столбцов;
  • Если таблица уже существует, проверьте, есть ли в таблице указанные столбцы (ключи к переданному словарю), и добавьте их, если это не так (возможно ли это даже в SQL?);
  • Добавить отдельные значения из моего словаря в соответствующие столбцы в словаре.

Я могу использовать INSERT для последнего, но это кажется очень жестким. Что произойдет, если столбцы не существуют, например? Как мы могли тогда добавить их?

Я не возражаю против того, приспособлен ли код для sqlite3 в Python 3, или просто как SQL; до тех пор, пока я могу работать над этим и использовать его до некоторой степени (и учиться на нем), я очень благодарен.

(С другой стороны, мне интересно, какие другие подходы я мог бы использовать вместо реляционной базы данных SQL; раньше я использовал Amazon SimpleDB и рассматривал возможность использования этого для этой цели, так как очень"динамически типизируется", но я хочу знать, какой код SQL мне нужно будет использовать для этой цели.)

1 Ответ

1 голос
/ 27 августа 2010
  1. SQLite3 динамически набирается, поэтому проблем нет.

  2. CREATE TABLE IF NOT EXISTS <name> ... См. здесь.

  3. Вы можете увидеть, существуют ли нужные столбцы в таблице, используя sqlite_master, задокументированный в этого FAQ. Вам нужно будет проанализировать столбец sql, но поскольку он точночто ваша программа предоставила для создания таблицы, вы должны знать синтаксис.

  4. Если столбец не существует, вы можете ALTER TABLE <nam>? ADD COLUMN ... См. здесь.

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