标签: sqlalchemy

在SQLAlchemy中,是否可以在使用声明式样式时声明级联关系?

在SQLAlchemy中,我们可以像这样声明表及其关系:

user = Table(
    'users', metadata,
    Column('id', Integer, primary_key=True))

address = Table(
    'adresses', metadata,
    Column('id', Integer, primary_key=True),
    Column('user_id', Integer, ForeignKey('user.id')))

class User(object): pass

class Address(object): pass

session.mapper(User, user, properties=dict(
    'address' = relation(Address, backref='user', cascade="all")))
Run Code Online (Sandbox Code Playgroud)

(请注意上面一行中的级联关系.)

但是,我们也可以使用一种称为声明式样式的替代速记样式,在这种样式中我们可以用更少的代码行表达相同的东西,省略mapper()关系:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)

class Adress(Base):
    __tablename__ = 'adresses'
    id = Column(Integer, primary_key=True)
    user_id = Column(Integer, ForeignKey('user.id')))
Run Code Online (Sandbox Code Playgroud)

但是,如果我们使用这种声明式样式,是否有另一种方法来定义级联关系?

sqlalchemy

0
推荐指数
1
解决办法
497
查看次数

使用in_的sqlalchemy过滤器

是否有更有效的方法来执行以下操作?我更感兴趣的是知道是否有办法设置"mylist"以匹配任何东西,如果day等于'all',因为在其他情况下,"mylist"可以包含更多元素.

if day == 'all':
    mylist = ['monday','tuesday','wednesday','thursday','friday','saturday','sunday']
else:
    mylist = [day] # day equal to one of the above

records = meta.Session.query(Transaction).filter(Transaction.day.in_(mylist)).all()
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

0
推荐指数
1
解决办法
5337
查看次数

在Sqlalchemy中,如果我使用session.add()添加一个对象并刷新它,session.query()不会给出该对象,为什么?

使用SQLAlchemy时,我使用session.add(objname)向会话添加一个对象,然后使用session.flush显式刷新它,或者在创建引擎本身时启用autoflush = True.

现在在会话中,如果想通过session.query(classname).all()返回该对象,我无法检索它.

为什么会这样?或者有没有一种方法,query()也可以检索刷新的对象.

python sql orm sqlalchemy

0
推荐指数
1
解决办法
2468
查看次数

如何在SQLAlchemy中以声明方式设置具有递归外键和关系的表?

假设我有一个表"节点",我存储一棵树.每个节点都有一个主键id和一个parent_id列.当然,我想访问每个节点实例的父属性,即关系.有人可能会尝试:

import sqlalchemy, sqlalchemy.orm, sqlalchemy.ext.declarative
engine = sqlalchemy.create_engine('sqlite:///PATHTOMYDATABASE', echo=True)
Base = sqlalchemy.ext.declarative.declarative_base()
class Node(Base):
    __tablename__ = "nodes"
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True) 
    parent_id = sqlalchemy.Column(sqlalchemy.Integer, sqlalchemy.ForeignKey("nodes.id"))
    parent = sqlalchemy.orm.relationship("Node", backref=sqlalchemy.orm.backref("childs"))
Base.metadata.create_all(engine)
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我收到一个错误:

sqlalchemy.exc.InvalidRequestError: Table 'nodes' is already defined for this MetaData instance. Specify 'useexisting=True' to redefine options and columns on an existing Table object.

我不明白我可以在什么时候设置这个选项'useexisting=True'.这是正确的方法吗?

编辑:事实上,错误来自原始脚本的另一部分.如果用临时数据库替换数据库路径:memory:,它可以正常工作.感谢TokenMacGuy.

因此,上面的例子可以被视为一个工作示例.

python sqlalchemy foreign-keys foreign-key-relationship

0
推荐指数
1
解决办法
4652
查看次数

Python - SqlAlchemy:按大圆距离过滤查询?

我使用Python和Sqlalchemy在Sqlite数据库中存储纬度和经度值.我为Location对象创建了一个混合方法,

@hybrid_method
def great_circle_distance(self, other):
    """
    Tries to calculate the great circle distance between the two locations

    If it succeeds, it will return the great-circle distance
    multiplied by 3959, which calculates the distance in miles.

    If it cannot, it will return None.

    """
    return math.acos(  self.cos_rad_lat 
                     * other.cos_rad_lat 
                     * math.cos(self.rad_lng - other.rad_lng)
                     + self.sin_rad_lat
                     * other.sin_rad_lat
                     ) * 3959
Run Code Online (Sandbox Code Playgroud)

所有值都是cos_rad_latsin_rad_lat我预先计算的值,以优化计算.无论如何,当我运行以下查询时,

pq = Session.query(model.Location).filter(model.Location.great_circle_distance(loc) < 10)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,

line 809, in great_circle_distance
    * math.cos(self.rad_lng - other.rad_lng) …
Run Code Online (Sandbox Code Playgroud)

python database sqlite pylons sqlalchemy

0
推荐指数
1
解决办法
1631
查看次数

如何根据时间戳对InstrumentedList进行排序?

目前InstrumentedList我的金字塔应用程序中代表了一对多的关系.这种关系以下列方式构建:

Class project:
 submissions = relationship('Submission', backref='project')
Run Code Online (Sandbox Code Playgroud)

我想迭代项目列表中的每个提交.但是,我希望我的提交按时间戳(datetime对象)排序

这是我现在迭代我的提交的方式:

for project in projects:
    for submission in project.submissions:
        # Do some stuff with each submission here
Run Code Online (Sandbox Code Playgroud)

问题是每当重新加载应用程序时,每个项目的提交顺序都会发生变化.我需要订单一致并按时间戳排序,我该怎么做呢?

python sqlalchemy pyramid

0
推荐指数
1
解决办法
1307
查看次数

如何导入别名的sqlalchemy函数

SQLAlchemy教程中

一个例子使用aliased

>>> from sqlalchemy import func
>>> ua = aliased(User)
>>> q = q.from_self(User.id, User.name, ua.name).\
...     filter(User.name < ua.name).\
...     filter(func.length(ua.name) != func.length(User.name))
Run Code Online (Sandbox Code Playgroud)

但是在0.6.1中不起作用:

>>> from sqlalchemy import func

>>> ua = aliased(User)


Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    ua = aliased(User)
NameError: name 'aliased' is not defined
>>> ua = aliased(User)


Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    ua = aliased(User)
NameError: name 'aliased' is …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy

0
推荐指数
1
解决办法
2028
查看次数

更新时密码未加密

作为python的新手,我不太清楚为什么我会得到不一致的结果.我注册了一个用户,我的表中的密码最终成为哈希版本.当用户更新其密码时,表中的密码最终为未散列的版本.显然,我想要哈希版本.我究竟做错了什么?(如果重要的话,我正在使用SQLAlchemy和mysql.)

我有以下内容:

def hash_password(password):
    blah, blah, blah # hash my password here
    return hashed_password

class User(Base):
    __tablename__ = 'mytable'
    email = Column('email')
    _password = Column('password')

    def _get_password(self):
        return self._password

    def _set_password(self, password):
        self._password = hash_password(password)
    password = property(_get_password, _set_password)
    password = synonym('_password', descriptor=password)

    def __init__(self, password="", email=""):
        self.email = email
        self.password = password
    @classmethod
    def register(cls, email, password):
        return DBSession.add(User(email=email,password=password)) # this correctly hashes the password

    @classmethod
    def update(cls, email, password):
        return DBSession.query(cls).filter(cls.email == email).update({'password': password}) #password ends up being …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy pyramid

0
推荐指数
1
解决办法
333
查看次数

如何在SQLAlchemy中表达JOIN和GROUP BY查询?

SELECT sector.sector, count(*) 
FROM reports, organization, sector 
WHERE reports.org_id = organization.id
    AND organization.id = sector.org_id
GROUP BY sector.sector;
Run Code Online (Sandbox Code Playgroud)

老实说,我甚至不确定从哪里开始表达这个GROUP BY并加入sqlalchemy.

postgresql sqlalchemy

0
推荐指数
1
解决办法
2730
查看次数

SQLAlchemy:逗号如何确定查询是返回String还是Tuple?

在SQLAlchemy中,如果你在查询中放一个逗号,如下所示,你会得到一个"字符串".如果你没有逗号,你会得到一个元组.为什么会这样?我看不到文档中解释的任何地方

使用SQLAlchemy0.8

以下代码返回一个字符串:

def get_password(self, member_id):
    for password, in session.query(Member.__table__.c.password).filter(self.__table__.c.id == member_id): 
        return password
Run Code Online (Sandbox Code Playgroud)

这将返回一个类'str': 'mypassword'

虽然下面的代码返回一个元组;

def get_password(self, member_id):
    for password in session.query(Member.__table__.c.password).filter(self.__table__.c.id == member_id): 
        return password
Run Code Online (Sandbox Code Playgroud)

这将返回一个类'sqlalchemy.util._collections.KeyedTuple':('mypassword',)

python sqlalchemy

0
推荐指数
1
解决办法
1213
查看次数