- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 Meter 对象模型
class Meter(db.Model):
"""
Model for repair meter.
"""
__tablename__ = 'meters'
id = db.Column(db.Integer, primary_key=True, nullable=False)
meter_no = db.Column(db.String(50), unique=True, nullable=False)
client = db.Column(db.String(50), unique=True, nullable=False)
problems = db.Column(db.PickleType)
functional = db.Column(db.Boolean(), default=False, server_default="false")
location = db.Column(db.Integer, db.ForeignKey('locations.id'))
date_in = db.Column(db.Date, default=dt.date.today())
date_out = db.Column(db.Date)
问题 PickleType 列存储一个包含问题对象 ID 的 Python 列表
然后我有这个函数尝试查询 meters 数据库表并仅获取列表存储中具有特定问题 ID (prob_id) 的 Meter 对象作为 PickleType。
def problemrate(prob_id, month):
"""
Return meters with the problem id for a particular month.
args:
prob_id (int): problem id
month (int): month number e.g. april -> 4
returns:
meters (list): list of meter objects
raises: None
"""
meters = Meter.query.filter(and_(extract('month', Meter.date_in) == month,
prob_id in Meter.problems)).all()
return meters
但是当调用该函数时出现错误:
NotImplementedError: Operator 'getitem' is not supported on this expression
通过 PickleType 列的内容过滤 sqlalchemy 查询的编写方法是什么?这是可能的还是 sqlalchemy 不支持这个?
最佳答案
简短说明:PickleType 不支持任何关系功能,例如查询/过滤器。它的目的是存储和检索。请改用 sqlalchemy.orm.relationship。
详细解释:错误信息实际上是正确的。 filter 函数中的所有内容都将编译为 sql 查询(打印查询以查看),因此“in”运算符不会编译为有效查询,任何其他 getItem 运算符也不会。起作用的是“==”,但是为此您需要传递完全相同的对象,以便可以将其转换为与存储的对象相同的 PickleType 对象。比较在内部完成。
解决方案:在普通 SQL 中,您可以将每个列表项分别存储在不同的表中,并通过 ID 关联。在 SQLAlchemy 中你可以做类似的事情:
from sqlalchemy.orm import relationship
from sqlalchemy.ext.associationproxy import association_proxy
class Meter(db.Model):
"""
Model for repair meter.
"""
__tablename__ = 'meters'
id = db.Column(db.Integer, primary_key=True, nullable=False)
meter_no = db.Column(db.String(50), unique=True, nullable=False)
client = db.Column(db.String(50), unique=True, nullable=False)
meter_problems = relationship('Problem', secondary=lambda: meterproblems_table)
functional = db.Column(db.Boolean(), default=False, server_default="false")
location = db.Column(db.Integer, db.ForeignKey('locations.id'))
date_in = db.Column(db.Date, default=dt.date.today())
date_out = db.Column(db.Date)
problems = association_proxy('meter_problems', 'problem')
class Problem(db.Model):
__tablename__ = 'problem'
id = db.Column(db.Integer, primary_key=True, nullable=False)
problem = db.Column('keyword', db.String(64))
def __init__(self, problem):
self.problem = problem
meterproblems_table = db.Table(
'meterproblems',
db.metadata,
db.Column(
'meter_id',
db.Integer,
db.ForeignKey("meters.id"),
primary_key=True
),
db.Column(
'problem_id',
db.Integer,
db.ForeignKey("problem.id"),
primary_key=True
)
)
你的查询会变成:
meters = Meter.query.filter(
extract('month', Meter.date_in) == month,
Meter.meter_problems.has(keyword=prob_id)
).all()
assocation_proxy 用于轻松地将项目添加到 meter_problems 列:
obj.problems.append('something')
其中 obj 是一个仪表对象。
文档 here
关于python - SQLAlchemy 按 PickleType 内容过滤查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23360666/
我正在尝试创建一个使用 UUID 作为主键的用户模型: from src.db import db # SQLAlchemy instance import sqlalchemy_utils impo
在 sqlalchemy 中,我试图合并表,然后使用 WHERE 和 ORDER_BY 创建别名 有点像 SELECT * FROM ( SELECT [TABLE_ONE].[SOME_ID]
我正在使用 SQL Alchemy(通过 Flask_sqlalchemy)将 Python 字典列表插入到 Postgres 数据库中。 其中一个表是所有唯一项目的列表(表 1),而第二个是与某个项
This source详细说明如何使用关联代理创建具有 ORM 对象值的 View 和对象。 但是,当我附加一个与数据库中现有对象匹配的值(并且所述值是唯一的或主键)时,它会创建一个冲突的对象,因此我
SQLAlchemy Core和SQLAlchemy ORM的目的有什么区别? 最佳答案 顾名思义,ORM是一个对象关系映射器:其目的是将数据库关系表示为Python对象。 核心是查询构建器。其目的是
带有ForeignKey的Column是否自动创建索引? 还是我需要手动添加index=True? some_field = Column(Integer, ForeignKey(SomeModel.
我有一个主数据库,每个客户自己的数据库连接存储在其中。 因此,每个客户端都使用2个db:main和它自己的db,必须确定其连接 对于每个http调用。我如何使用flask-sqlalchemy扩展名执
当我仅对类进行继承时,它才起作用 class User(Base): __tablename__ = ’users’ id = Column(Integer, primary_key=
从用户的角度来看,SQLAlchemy 的查询日志似乎有点过于冗长,有时甚至有点神秘: 2015-10-02 13:51:39,500 INFO sqlalchemy.engine.base.Engi
我正在尝试使用 wtforms.ext.sqlalchemy QuerySelectMultipleField 显示复选框列表,但我无法在 GET 的表单上显示模型数据。 这是我的models.py
我想为查询返回一个中继连接。使用标准的 graphene-sqlalchemy 你可以这样做: class Query(graphene.ObjectType): node = relay.N
我在 centos 7.5 虚拟机上部署了最新的 Airflow ,并将 sql_alchemy_conn 和 result_backend 更新到 postgresql 实例上的 postgres
我想将多个项目插入到一个表中,并在发生冲突时更新该表。这是我想出的以下内容 from sqlalchemy.dialects.postgresql import insert meta = MetaD
我有以下模型: class Item(Base): a = relationship() b = relationship() c = relationship() d
我有 presto 和 superset 设置。 presto 运行良好,可以通过命令访问: ./app/hadoop/setjdk8.sh;bin/presto-cli --server http:
我一直在寻找一种在 sqlalchemy 中使用 tsvector 的方法(就像 INTEGER 等其他方法一样),但到目前为止我还不清楚如何做到这一点。我读过可以使用 UserDefinedType
我正在使用 sqlalchemy(现在使用 sqlite,但稍后可能会改变)来构建一个数据库,其中插入的顺序和 rowids 很重要。我基本上有以下几点: class Message(Base):
给定一个对象,我想知道如何知道它是否是 sqlalchemy 映射模型的实例。 通常,我会使用 isinstance(obj, DeclarativeBase)。但是,在这种情况下,我没有可用的 De
我已经通读了查询文档,如果有办法从查询中获取表名,就看不到任何地方 - 例如如果我有 q = query(Users) ,我可以得到Users从 q 退出? 最佳答案 请注意,像您这样的事件简单查询可
我不确定如何定义create schema foo迁移?我的模型如下所示(我正在使用Flask-Migrate): class MyTable(db.Model): __tablename__
我是一名优秀的程序员,十分优秀!