是否可以将Python类对象存储在SQLite中?

2024-03-28 20:42:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将Python对象存储到SQLite数据库中。有可能吗?

如果是的话,会有什么链接/例子呢?


Tags: 对象数据库sqlite链接例子
3条回答

是的,这是可能的,但有不同的方法,哪一个是合适的,将取决于你的要求。

不能将对象本身存储在数据库中。您要做的是存储对象中的数据并在以后重新构建它。

一个好的方法是使用优秀的SQLAlchemy库。它允许您将定义的类映射到数据库中的表。每个映射的属性都将被存储,并可用于重建对象。查询数据库将返回类的实例。

有了它,您不仅可以使用sqlite,还可以使用大多数数据库——它目前还支持Postgres、MySQL、Oracle、MS-SQL、Firebird、MaxDB、MS-Access、Sybase、Informix和IBM DB2。你可以让你的用户选择她想使用哪一个,因为你基本上可以在这些数据库之间切换,而不需要改变代码。

还有很多很酷的特性,比如自动JOIN,多态性。。。

一个简单快速的示例,您可以运行:

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

因此,您可以有效地将对象存储到数据库中,这是最好的方法。

您可以使用pickle.dumps,它的返回可拾取对象作为字符串,您不需要将其写入临时文件。

Return the pickled representation of the object as a string, instead of writing it to a file.

import pickle

class Foo:
    attr = 'a class attr'

picklestring = pickle.dumps(Foo)

相关问题 更多 >