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

标签 python sqlite serialization

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

如果是这样,它的一些链接/示例是什么?

最佳答案

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

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

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

还有很多很酷的功能——比如自动JOINs、多态...

您可以运行的快速、简单的示例:

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

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

关于python - 是否可以在 SQLite 中存储 Python 类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2047814/

相关文章:

ruby-on-rails - SQLite3 错误 - 无法回滚 - 没有事务处于事件状态

java - Java中的序列化对象大小与内存对象大小

java - 使用 JSEFA 将不同类的 java 对象序列化为 CSV 中的一行

python - 如何将多个参数传递给 panda 中的 map 函数

Python,threading.timer对象不会运行定时器函数?

mysql - 从单行中选择重复项?

c# - Json.net反序列化具有并发集合的复杂对象

python - 从与 __init__ 导入同名的 python 模块导入对象

python - 导入 pytorch 模块时出错。 (指定的模块无法找到。)

python - "Incorrect number of bindings supplied"cPython 3.5 SQLite3 VS15