Django Models / SQLAlchemy 太臃肿了!有没有真正的 Pythonic DB 模型?

2023-12-30

"让事情尽可能简单,但不能更简单。"

我们能找到修复 Python 数据库世界的解决方案吗?

Update: Alex Martelli 编写了“lustdb”原型 http://groups.google.com/group/lustdb- 如果您知道任何具有多个后端的轻量级高级数据库库,我们可以将其封装在语法糖蜂蜜中,请权衡!

from someAmazingDB import *  
#we imported a smart model class and db object which talk to database adapter/s
class Task (model): 
    title = ''
    done = False #native types not a custom object we have to think about!

db.taskList = []
#or
db.taskList = expandableTypeCollection(Task) #not sure what this syntax would be

db['taskList'].append(Task(title='Beat old sql interfaces',done=False))
db.taskList.append(Task('Illustrate different syntax modes',True)) # ok maybe we should just use kwargs

#at this point it should be autosaved to a default db option

#by default we should be able to reload the console and access the default db:

>> from someAmazingDB import *
>> print 'Done tasks:'
>> for task in db.taskList:
>>     if task.done:
>>         print task.title
'Illustrate different syntax modes'

我是以下的粉丝Python、webPy 和 Cherry Py,以及KISS一般来说。

在说话自动的Python 到 SQL类型翻译或NoSQL。我们不必完全兼容 SQL!只是一个可扩展的子集或忽略它!

回复:模型更改,当开发人员尝试更改模型或有一组合理的默认值时可以询问他们。

这是挑战:上面的代码只需很少的修改或思考就可以工作。当我们了解得更多时,为什么我们必须忍受妥协?

现在是 2010 年,我们应该能够在睡梦中编写可扩展的、简单的数据库。

如果您认为这很重要,请点赞!


您所请求的内容无法在 Python 2 中完成。whatever,出于非常具体的原因。你想写:

class Task(model): 
    title = ''
    isDone = False

在Python 2中。anything, whatever model可能是,这不可能ever允许您预测两个字段的任何“顺序”,因为 a 的语义class声明是:

  1. 执行主体,从而准备一个dict
  2. 找到元类并运行其特殊方法

无论元类是什么,步骤 1 都破坏了字段顺序的任何可预测性。

因此,您希望在代码片段中使用位置参数:

Task('Illustrate different syntax modes', True)

无法将参数的值与模型的各个字段关联起来。 (尝试通过类型关联来猜测 - 希望没有两个字段具有相同的类型 - 比你表达的使用愿望更可怕db.tasklist and db['tasklist']无关紧要和可互换)。

Python 3 中的一项向后不兼容的更改是专门为了处理此类情况而引入的。在Python 3中,自定义元类可以定义__prepare__运行的函数before上面简化列表中的“步骤 1”,这让它可以更好地控制类的主体。具体来说,引用PEP 3115 http://www.python.org/dev/peps/pep-3115/...:

__prepare__返回一个类似字典的对象,用于存储 评估类主体期间的类成员定义。 换句话说,类体被评估为一个功能块 (就像现在一样),除了局部变量字典 被替换为返回的字典__prepare__。这 字典对象可以是常规字典或自定义映射 类型。

...

一个例子是元类 使用有关的信息 创建 C 结构体的成员声明的顺序。元类 将提供一个自定义字典,仅记录 插入顺序。

您不想像本示例中那样“创建 C 结构”,但字段的顺序至关重要(以允许使用您想要的位置参数),因此自定义元类(通过基类获得)model)会有一个__prepare__返回有序字典的类方法。这消除了具体问题,但是,当然,only如果您愿意将使用此“神奇 ORM”的所有代码切换到 Python 3。您愿意吗?

一旦解决了,问题就是您想要执行哪些数据库操作以及如何执行。当然,你的例子根本没有澄清这一点。是个taskList属性名称特殊,或者应该any分配给的其他属性db对象在使用时“自动保存”(通过名称和其他什么特征?)和“自动检索”?是否有办法删除实体、改变它们、定位它们(​​除了曾经被列在实体的相同属性中之外)db目的)?如果需要身份验证,您的示例代码如何知道要使用什么数据库服务以及如何对其进行身份验证(例如通过用户 ID 和密码)?

您列出的具体任务并不难实现(例如,在 Google App Engine 的存储服务之上,它不需要身份验证,也不需要指定“使用什么数据库服务”)。model的元类会内省该类的字段并生成一个 GAEModel对于班级来说,db对象将使用__setattr__设置一个atexit用于存储属性的最终值的触发器(作为不同类型的实体)Model当然),并且__getattr__从存储中取回该属性的信息。当然,如果没有一些额外的数据库功能,这一切都将毫无用处;-)。

Edit:所以我做了一个小原型(Python 2.6,基于 sqlite)并将其放在http://www.aleax.it/lustdb.zip http://www.aleax.it/lustdb.zip-- 这是一个 3K zip 文件,包含 225 行lustdb.py(太长了,无法在这里发布)和两个小测试文件,大致相当于OP的原始文件:test0.py is...:

from lustdb import *  

class Task(Model): 
    title = ''
    done = False

db.taskList = []    
db.taskList.append(Task(title='Beat old sql interfaces', done=False))
db.taskList.append(Task(title='Illustrate different syntax modes', done=True))

and test1.p1 is...:

from lustdb import *

print 'Done tasks:'
for task in db.taskList:
    if task.done:
        print task

Running test0.py(在具有可写的机器上/tmp目录——即任何 Unix-y 操作系统,或者在 Windows 上,一个mkdir \tmp之前已运行过;-) 没有输出;之后,运行test1.py输出:

Done tasks:
Task(done=True, title=u'Illustrate different syntax modes')

请注意,这些在很多方面都远不如OP的例子那么“疯狂神奇”,例如......:

1. no (expletive delete) redundancy whereby `db.taskList` is a synonym of `db['taskList']`, only the sensible former syntax (attribute-access) is supported
2. no mysterious (and totally crazy) way whereby a `done` attribute magically becomes `isDone` instead midway through the code
3. no mysterious (and utterly batty) way whereby a `print task` arbitrarily (or magically?) picks and prints just one of the attributes of the task
4. no weird gyrations and incantations to allow positional-attributes in lieu of named ones (this one the OP agreed to)

当然,原型(就像原型一样;-)在许多方面(清晰度、文档、单元测试、优化、错误检查和诊断、不同后端之间的可移植性,尤其是超出中暗示的数据库功能)还有很多不足之处。的问题)。缺少的数据库功能非常多(例如,OP的原始示例无法识别模型的“主键”或任何其他类型的唯一性约束,因此重复项可能比比皆是;并且从那里开始只会变得更糟;- )。尽管如此,对于 225 行(除去空行、注释和文档字符串,净值为 190 行;-),在我的偏见看来,这还不算太糟糕。

继续玩这个项目的正确方法当然是启动一个新的lustdbcode.google.com 托管部分的开源项目(或任何其他具有问题跟踪器、wiki、代码审查支持、在线浏览、DVCS 支持等的良好开源托管网站) - 我会自己做,但是我在 code.google.com 上可以启动的开源项目数量已接近极限,并且不想以这种方式“烧掉”最后一两个项目;-)。

顺便说一句,lustdb该模块的名称是一个带有 OP 首字母缩写的文字游戏(名字和姓氏各前两个字母),遵循以下传统:awk和朋友们——我认为这听起来不错(以及大多数其他明显的名字,例如simpledb and dumbdb被采取;-)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django Models / SQLAlchemy 太臃肿了!有没有真正的 Pythonic DB 模型? 的相关文章

随机推荐

  • 确定平均课程成绩的程序[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 该程序应该将包含学生测验成绩的文本文件写入另一个包含学生姓名的文件中 并为学生分配成绩 include
  • Google 帐户身份验证器在运行时请求许可

    我使用服务中的 AccountManager getAuthToken 来访问 Googledocs 和 Spreadsheet API 由于我是从后台执行此操作并且不想中断 user 因此我允许 accountManager 在需要用户交
  • Firebase minInstances 被忽略

    我们的目标是为 Firebase 云功能设置最小实例数 以便能够处理意外的流量突发 我们已经关注了这些说明 https firebase google com docs functions manage functions reduce t
  • 如何在特定条件下删除重复项

    我有一个 mysql 表 我想在特定条件下删除重复项 如果名称 cl 1 cl 2 cl 3 cl 4 cl 5 cl 6 完全相同 我想删除 否则如果其中一个不同且其他列相同 则无需删除 例如我想删除第 1 行和第 4 行而不是第 7 行
  • SQL 使用内连接将不存在的行的聚合值设为 0

    我正在使用 SQL Server 查询这三个表 它们看起来像 有一些额外的列 但不那么相关 客户 gt ID 姓名 地址 gt ID 街道 StreetNo CustomerId 销售 gt 地址 ID 周 总计 我想获得每周和客户的总销售
  • 将tinyint映射为布尔休眠

    我在 MySQL 表 TINYINT 1 中有一个 BOOLEAN 类型 并且我试图在实体中映射布尔字段 但这会生成异常 org hibernate HibernateException Wrong column type in maegu
  • SQL Server 存储过程转换为 SSIS 包

    问题 目前我们有大量的存储过程 很长 长达 10 000 行 这些存储过程是由不同的开发人员在过去 10 年中根据不同的需求编写的 现在管理那些复杂 长的存储过程 没有适当的文档 变得很困难 我们计划将这些存储过程移至 SSIS ETL 包
  • PostgreSQL:当将整数转换为非整数类型以强制 PostgreSQL 中的浮点除法时,我应该使用哪种数字类型?

    我知道StackOverflow上有很多整数除法问题 但我没有看到这个 与许多编程语言类似 如果两个操作数都是整数 PostgreSQL 就会执行整数除法 如果一个人有 SELECT s id AS student id COUNT DIS
  • 我的 ASP.NET MVC SelectList 有什么问题?

    我正在尝试使用 SelectList 我的视图之一 但它只是未正确填充 它获得了正确数量的条目 4 但它们都读取了System Web Mvc SelectListItem 我启动了代码调试器 发现发生了一些奇怪的事情 我一定做错了什么 但
  • 如何获得 R 时间序列中下一行和上一行之间的差异?

    我有一个相当大的时间序列 包含 4 个变量的大约 14k 个观察值 date x y z 我怎样才能 与功能相反diff df vector lag 1 它计算当前值之间的差值 t 和上一个 t 1 计算每个值与下一个值 t 1 和之前的值
  • 从 DllMain() 锁定时,Visual Studio 2012 中的 C++11 std::mutex 死锁

    我看到了僵局std mutex当互斥体被锁定时DllMain 下面是一个最小的 DLL 测试用例 它向我展示了这个问题 我的实际代码执行互斥锁定 因为它使用的成员函数也可以在正常函数期间在初始化之外使用 我认为问题是调度程序之间的死锁 如调
  • 模仿 Python 产量的惯用 Clojure 方式

    我正在迭代一个列表 边走边建立状态 偶尔当我遇到某个哨兵时 我会返回一个结果 如果我用 Python 来做这件事 我会懒惰地yield结果 跟踪函数本地范围内的状态 this is simplified for illustration d
  • 计算列表差异[重复]

    这个问题在这里已经有答案了 在Python中 计算两个列表之间差异的最佳方法是什么 example A 1 2 3 4 B 2 5 A B 1 3 4 B A 5 If 顺序并不重要 您可以简单地计算集合差 gt gt gt set 1 2
  • 在 Ada 中实现具有访问类型的抽象函数

    我有一个名为 Statements 的包 其中包含一个名为 Statement 的抽象类型和一个名为execute 的抽象函数 在另一个包中 我有一个CompoundStatement 类型 它是一个Statement 类型 它实现了exe
  • 如何在 WP7 silverlight 中将网格背景更改为图像?

    我正在尝试在 WP7 silverlight 中为网格控件设置背景 我需要以编程方式完成此操作 而不是在设计中 我尝试过类似的东西 ContentPanel Background new BitmapImage new Uri Images
  • 关于最小化代码和最大化数据哲学的思考

    我听说过最小化代码和最大化数据的概念 并且想知道其他人可以就我在构建自己的系统时如何 为什么应该这样做提供什么建议 通常 数据驱动的代码更易于阅读和维护 我知道我见过数据驱动被推向极端并且最终变得非常不可用的情况 我正在考虑我使用过的一些
  • Volusion API - 按日期范围导出订单

    我想按计划按日期范围导出 Volusion 订单 select from orders o where o OrderDate gt 7 20 2015 AND o OrderDate lt 7 23 2015 这可能吗 看来我的网址只能做
  • Android - 验证XML的签名

    我已经在网络上签署了 XML 文档 通过带有 RSA 和 X509 标签的纯 Java 并且我已经实现了 XML pull 解析器 在将 XML 文档中的一些信息解析到特定 URL 之前 我需要验证该文档是否正确一 你知道如何检查XML签名
  • 跨子域使用会话存储

    我有两个域domain1 site com 和domain2 site com 我在domain1 site com 中设置了会话存储 然后无法从同一选项卡获取其他域domain2 site com 上的会话存储 在跨子域导航时是否有其他方
  • Django Models / SQLAlchemy 太臃肿了!有没有真正的 Pythonic DB 模型?

    让事情尽可能简单 但不能更简单 我们能找到修复 Python 数据库世界的解决方案吗 Update Alex Martelli 编写了 lustdb 原型 http groups google com group lustdb 如果您知道任