简单/智能的Python数据库解决方案,能使用Python类型+语法?(键/值字典,数组,也许是有序字典)

4 投票
5 回答
1276 浏览
提问于 2025-04-15 23:32

我在寻找一些能突破常规的解决方案,具体要求如下:

避免

  • 手动编写SQL查询(希望用Python时能更面向对象,而不是传递字符串)
  • 使用非Python的数据类型来定义模型
  • 使用一种新类型,而不是直接使用Python自带的类型

希望能做到

  • 使用Python对象
  • 采用面向对象的方法以及基于键的获取和创建
  • 快速原型开发
  • 不需要创建SQL表
  • 能够推断模型/类型,或者根本不需要模型
  • 减少输入的行数和字符数

能够轻松地输出和输入JSON,可能还包括XML或者Protocol Buffers

我从事网页、桌面和移动软件开发,所以越便携越好。

python
>> from someAmazingDB import *

>> db.taskList = []

>> db['taskList'].append({title:'Beat old sql interfaces','done':False})
>> db.taskList.append({title:'Illustrate different syntax modes','done':True})

#at this point it should autosave
#we should be able to reload the console and access like:
python
>> from someAmazingDB import *
>> print 'Done tasks'
>> for task in db.taskList:
>>     if task.done:
>>         print task
'Illustrate different syntax modes'

这是个挑战:上面的代码应该只需要很少的修改或思考就能工作。可能只需要改一下导入语句,或者稍微调整一下,但Django模型和SQLAlchemy不够用

我希望能得到比“试试Shelve”或“用pickle”更有趣的库推荐。

我不反对使用Python类来做模型,但这些类应该非常简单明了,而不是像Django等框架那样复杂。

5 个回答

1

数据库访问没有比SQLAlchemy更好的了。

1

你能说说Django的模型哪里让你觉得不简单吗?我来给你讲讲我在Django里是怎么做的:

from django.db import models
class Task(models.Model):
    title = models.CharField(max_length=...)
    is_done = models.BooleanField()
    def __unicode__(self):
        return self.title

----

from mysite.tasks.models import Task
t = Task(title='Beat old sql interfaces', is_done=True)
t.save()

----

from mysite.tasks.models import Task
print 'Done tasks'
for task in Task.objects.filter(is_done=True):
    print task

在我看来,这个过程挺简单的!而且,这样做的表格和对象命名方式也稍微干净一些。如果你想单独使用Django的数据库模块,而不是和Django的其他部分一起用,那可能会有点复杂,但也是可以做到的。

2

我今天早些时候其实在做类似的事情。现在还没有说明文档或者足够的测试,不过你可以看看这个链接:http://github.com/mikeboers/LiteMap/blob/master/litemap.py

LiteMap这个类的功能和内置的字典(dict)很像,但它会把数据保存到一个SQLite数据库里。你没有说明你具体想用什么数据库,不过这个类几乎可以很简单地修改成适用于任何数据库。

另外,它也不跟踪可变对象的变化(比如你提到的在列表中添加元素),但它的接口非常简单。

撰写回答