Я играю с модулем 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 мне нужно будет использовать для этой цели.)