Вы не можете сохранить сам объект в БД. То, что вы делаете - это сохраняете данные объекта и восстанавливаете их позже.
Хороший способ - использовать превосходную библиотеку SQLAlchemy . Это позволяет вам сопоставить ваш определенный класс с таблицей в базе данных. Каждый сопоставленный атрибут будет сохранен и может быть использован для восстановления объекта. Запрос к базе данных возвращает экземпляры вашего класса.
С ним вы можете использовать не только sqlite, но и большинство баз данных. В настоящее время он также поддерживает Postgres, MySQL, Oracle, MS-SQL, Firebird, MaxDB, MS Access, Sybase, Informix и IBM DB2. И вы можете попросить своего пользователя выбрать, какую из них он хочет использовать, потому что вы можете переключаться между этими базами данных, вообще не меняя код.
Есть также много интересных функций, таких как автоматическое JOIN
s, полиморфирование ...
Быстрый простой пример, который вы можете запустить:
from sqlalchemy import Column, Integer, Unicode, UnicodeText, String
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from random import choice
from string import letters
engine = create_engine('sqlite:////tmp/teste.db', echo=True)
Base = declarative_base(bind=engine)
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(Unicode(40))
address = Column(UnicodeText, nullable=True)
password = Column(String(20))
def __init__(self, name, address=None, password=None):
self.name = name
self.address = address
if password is None:
password = ''.join(choice(letters) for n in xrange(10))
self.password = password
Base.metadata.create_all()
Session = sessionmaker(bind=engine)
s = Session()
Тогда я могу использовать это так:
# create instances of my user object
u = User('nosklo')
u.address = '66 Some Street #500'
u2 = User('lakshmipathi')
u2.password = 'ihtapimhskal'
# testing
s.add_all([u, u2])
s.commit()
Это будет запускать INSERT
операторов для базы данных.
# When you query the data back it returns instances of your class:
for user in s.query(User):
print type(user), user.name, user.password
Этот запрос будет выполняться SELECT users.id AS users_id, users.name AS users_name, users.address AS users_address, users.password AS users_password
.
Напечатанный результат будет:
<class '__main__.User'> nosklo aBPDXlTPJs
<class '__main__.User'> lakshmipathi ihtapimhskal
Таким образом, вы эффективно храните свой объект в базе данных, как лучше.