问题标签 [ponyorm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何在 Pony ORM 中创建/连接 postgres 数据库?
我正在尝试将 postgres 数据库创建/连接到我正在做的 Pony ORM Web 应用程序。起初我使用带有 Pony ORM 的 sqlite 数据库,一切正常,但我需要切换到 postgres,因为我想把它放在 Heroku 上。我使用图形 postgres 工具并创建了一个名为“notice_db”的数据库和一个名为 notice 的 postgres 用户。我将数据库与小马绑定的代码是:
它会找到用户并连接到本地主机,但不会连接或创建数据库,所以当我尝试使用 Pony ORM 函数时,例如为我的用户类创建一个具有“用户名”属性的数据库实体时,我收到此错误:“ProgrammingError :列“用户名”不存在第 1 行:从用户中选择 * 其中用户名 = 'user1'”。
Pony 不连接或创建 postgres 数据库。所以我想知道如何将 postgres 数据库连接到 Pony ORM 应用程序?
attributes - 是否可以在 Pony ORM 中向多对多关系的中间表添加额外的属性?
在 Pony ORM 中,可以“自动”创建多对多关系。例如,来自文档(对于 0.6 版,强调我的):
为了创建多对多关系,您需要将关系的两端定义为 Set 属性:
为了在数据库中实现这种关系,Pony 会创建一个中间表。这是一个众所周知的解决方案,它允许您在关系数据库中建立多对多关系。
是否可以在自动创建的中间表中创建一个额外的属性(列),所以不仅仅是“产品”和“标签”的外键,还有时间戳?
如果是,如何?
如果没有,我想我将不得不显式地创建中间表。在那种情况下,我是否仍然可以使用 nice Set
-attribute 定义(可能是中间表,指示感兴趣的属性)?
sqlite - 如何在 Pony ORM 应用程序中集成 sqlite3 的全文搜索
Python 的标准库模块 sqlite3 支持加载 sqlite 扩展,也是全文搜索之一。ORM Peewee还包括支持。(两者都支持FTS3/FTS4和 Peewee 也明确支持 FTS5。
我如何最好地将 sqlite3 的全文搜索(无论是 FTS3/FTS4 还是 FTS5)集成到 Pony ORM 应用程序中?
我想原则上,我可以使用 sqlite3 模块甚至 Peewee 连接到数据库并使用它们的功能。但是,我不知道是否有任何关于并发访问数据库文件的问题。还有可能更好地集成全文搜索,例如,全文搜索可以使用理解语法来完成。
python - PonyORM、SQLite 性能
我在 Raspberry PI 3 上使用 PonyORM 作为我的 SQLite 数据库的 ORM 和 Python 3.5(不是你能想象的最快的设备,但它不应该那么糟糕)。
一些操作,例如插入,似乎非常慢。一次插入包含 3 个短字符串的实体可能需要 4 - 10 秒。
这是我的 datamodel.py 文件:
我还创建了一个非常简单的性能测试:
它的样本结果:
SQL 查询字符串打印得很快,所以我猜这里的翻译不是问题,但是正如你所看到的,整个操作需要几秒钟。
这可能是什么原因?有什么办法可以改善这个荒谬的长时间吗?
python - pony.orm 按关系中的最新实体排序
假设我将这些表映射为pony.orm
:
现在我想获取最新帖子订购的某个类别的所有线程:
通过这一行,我得到了最新帖子的ID,但我想要这个对象。
我当然可以[(Post[i], thread) for i, thread in query]
或select(p for p in Post if p.id in [i for i,_ in query])
但这会创建额外的 sql 语句。所以我的问题是:如何使用单个 sql 语句获取某个类别中所有线程的最新帖子,按该帖子的时间戳排序。
db.execute(sql)
如果您不能使用 ORM,我不会使用。
ponyorm - 选择在其他记录列表中未找到的记录
设想
玩家参加活动。他们应该提供是否要参加活动的信息。
待解决的问题
如果他们计划参加特定活动,我想选择尚未提供信息的玩家。
你的目标
作为所用技术的初学者,我将感谢您的验证和建议,以改进我在下面建议的解决方案。
解决方案
技术: python、postgreSQL 和 Pony ORM
Pony ORM 中的实体模型:
主意:
- 获取参加活动时提供信息的玩家列表
- 获取不在 1 中创建的列表中的玩家列表。
该想法的当前实现:
python - Pony ORM - 按特定顺序排序
执行 Pony ORM 查询并尝试按模型上的三个属性对查询进行排序。首先是歌曲类型,可以是 中列出的五个值之一ssf_type_order_map
,然后是持续时间(int)和 uuid(字符串)。
对于歌曲类型,我希望歌曲按以下顺序排序:完整、完整(乐器)、短裤、循环、茎
如果我尝试使用以下.order_by()
调用进行排序,它不会返回任何错误,但不会按类型排序,因为我需要按上述顺序进行排序(但持续时间和 UUID 排序工作正常)。
这就是我认为理想的查询,将字符串类型映射到对其排序进行排序的映射。
ssf_type_order_map
但是当我运行这个说“表达式有不支持的类型'dict'时我得到一个错误。
order_by here上的 Pony ORM 文档对在这种情况下使用 lambdas 非常模糊。
更新 - 9 月 7 日
我还尝试在模型上添加以下 getter 属性,如下所示:
然后我尝试按如下方式对查询进行排序:
但我收到一个错误,基本上说模型没有这个属性。基于 Django 的 ORM 的类似问题,我的假设是您只能访问数据库模型中存在的属性。
如果 Pony 也是这种情况,那么如何完成我想要完成的事情呢?
python - PonyORM:在不知道哪些项目已经存在的情况下,将新项目添加到小马数据库的最有效方法是什么?
如果这是一个明显的问题,请原谅我,但我对小马和数据库一般来说是新手,并且没有找到回答这个问题的文档的正确部分。
我正在尝试创建一个包含公司以及这些公司设有办事处的位置的数据库。这是一个多对多的关系,因为每个公司位于多个位置,并且每个位置都可以托管多个公司。我这样定义我的实体:
理想情况下,我希望能够编写一个函数,将公司添加到数据库中,同时添加该公司存在的位置列表,同时确保添加新的位置实例(如果它们尚不存在)。我可以很快想到两种方法。
首先是尝试输入该位置,即使它存在并处理异常:
其次是查询数据库并询问位置是否存在:
在这两个中,我猜想更 Pythonic 的方法是简单地处理异常,但这会遇到 N+1 问题吗?我注意到通过使用名称作为主键,我每次使用索引访问实体时都会进行查询。当我只是让小马选择顺序 ID 时,我似乎不需要查询。我还没有用任何大型数据集对此进行测试,所以我还没有进行基准测试。
python - 在与 ponyorm 多对多关系的情况下如何选择记录
我是新来的小马。
假设我有这两个类和它们之间的多对多关系:
我想选择一些特定学生学习的课程。我要做的是:
我得到这个错误:
这样做的正确方法是什么?谢谢
python - PonyORM(Python)“值已在当前事务之外更新”但不是
我正在使用 Pony ORM 0.7 版和磁盘上的 Sqlite3 数据库,并遇到了这个问题:我正在执行选择,然后是更新,然后是选择,然后是另一个更新,并收到错误消息
我已将问题减少到导致问题的最小命令集(即删除任何内容会导致问题不发生):
为了完整起见,这里是 的定义Task
:
另外,如果我从我的选择中删除约束task.order_id == 2
,则问题不再发生,所以我认为问题与基于事务开始后已更改的字段的查询有关,但我不知道为什么错误消息告诉我它已被不同的事务更改(除非可能db.execute
是在单独的事务中执行,因为它是原始 SQL?)
我已经看过这个类似的问题,但问题不同(Pony ORM 报告记录“在当前事务之外更新”而没有其他事务)和本文档(https://docs.ponyorm.com/ transactions.html ) 但都没有解决我的问题。
有什么想法可能会在这里发生吗?