gpt4 book ai didi

python - 使用 sqlalchemy 在 sqlite 数据库中存储列表/元组

转载 作者:行者123 更新时间:2023-11-28 23:05:28 30 4
gpt4 key购买 nike

我有一个类保存我在屏幕上绘制的东西的大小和位置。我正在使用带有 sqlite 数据库的 sqlalchemy 来保存这些对象。但是,该位置是一个二维值(x 和 y),我希望有一种方便的方式来访问它作为

MyObject.pos # preferred, simpler interface

# instead of:
MyObject.x
MyObject.y # inconvenient

我可以使用属性,但这个解决方案不是最优的,因为我不能基于属性进行查询

session.query(MyObject).filter(MyObject.pos==some_pos).all()

有没有什么方法可以使用集合或关联代理来获得我想要的行为?

最佳答案

如果您使用 PostGIS (postgres 的几何扩展版本),您可以使用 GeoAlchemy 来利用它,它允许您根据 PostGIS 中可用的几何图元定义列类型。一种这样的数据类型是 Point,顾名思义。

PostGIS 比 vanilla PostgreSQL 更难设置,但如果您确实打算根据实际几何术语进行查询,那么额外(大部分是一次)的麻烦是值得的。

另一个解决方案,使用普通 SQLAlchemy 是 define your own column types具有所需的语义,并在编译时将它们转换为您的数据库支持的更原始的类型。


实际上,您可以使用属性,但不能使用内置的 property 装饰器。您必须更加努力地工作并创建您自己的自定义描述符。

您可能想要积分等级。一个不错的选择实际上是使用命名元组,因为您不必担心代理分配个人坐标。属性被分配全部或没有

Point = collections.namedtuple('Point', 'x y')

这至少能让我们比较点值。下一步编写描述符是通过它的方法来工作的。有两种方法可以考虑,__get____set__,和get,两种情况,调用时一个实例,你应该处理实际的点值,以及何时调用了,你应该把它变成一个列表达式。

在最后一种情况下要返回什么有点棘手。我们想要的是东西这将在与一个点进行比较时返回一个列表达式,该表达式等于具有各个坐标的各个列。好吧再做一个类。

class PointColumnProxy(object):
def __init__(self, x, y):
''' these x and y's are the actual sqlalchemy columns '''
self.x, self.y = x, y

def __eq__(self, pos):
return sqlalchemy.and_(self.x == pos.x,
self.y == pos.y)

剩下的就是定义实际的描述符类。

class PointProperty(object):
def __init__(self, x, y):
''' x and y are the names of the coordinate attributes '''
self.x = x
self.y = y

def __set__(self, instance, value):
assert type(value) == Point
setattr(instance, self.x, value.x)
setattr(instance, self.y, value.y)


def __get__(self, instance, owner):
if instance is not None:
return Point(x=getattr(instance, self.x),
y=getattr(instance, self.y))
else: # called on the Class
return PointColumnProxy(getattr(owner, self.x),
getattr(owner, self.y))

可以这样使用:

Base = sqlalchemy.ext.declarative.declarative_base()
class MyObject(Base):
x = Column(Float)
y = Column(Float)

pos = PointProperty('x', 'y')

关于python - 使用 sqlalchemy 在 sqlite 数据库中存储列表/元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6092616/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com