您不能将对象本身存储在数据库中。您所做的是从对象中存储数据,并在以后进行重构。
一个很好的方法是使用优秀的SQLAlchemy库。它可以将您定义的类映射到数据库中的表。每个映射属性将被存储,并且可以用于重构对象。查询数据库返回你的类的实例。
有了它,您不仅可以使用sqlite,还可以使用大多数数据库 – 它目前还支持Postgres,MysqL,Oracle,MS-sql,Firebird,MaxDB,MS Access,Sybase,Informix和IBM DB2。并且您可以让用户选择要使用哪一个,因为您可以在这些数据库之间进行切换,而无需更改代码。
一个快速简单的例子,你可以运行:
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