小编Ilj*_*ilä的帖子

过滤SQLalchemy中的左连接

使用SQLalchemy我想执行左外连接并过滤掉在连接表中具有匹配项的行.

我正在发送推送通知,所以我有一张Notification桌子.这意味着我还有一个ExpiredDeviceId表来存储不再有效的device_ids.(我不想只删除受影响的通知,因为用户以后可能会重新安装应用程序,此时通知应根据Apple的文档恢复.)

CREATE TABLE Notification (device_id TEXT, time DATETIME);
CREATE TABLE ExpiredDeviceId (device_id TEXT PRIMARY KEY, expiration_time DATETIME);
Run Code Online (Sandbox Code Playgroud)

注意:每个device_id可能有多个通知.每个设备都没有"设备"表.

所以在做的时候SELECT FROM Notification我应该相应地过滤.我可以在SQL中做到这一点:

SELECT * FROM Notification 
    LEFT OUTER JOIN ExpiredDeviceId 
    ON Notification.device_id = ExpiredDeviceId.device_id
WHERE expiration_time IS NULL
Run Code Online (Sandbox Code Playgroud)

但是我怎么能在SQLalchemy中做到这一点?

sess.query(
    Notification, 
    ExpiredDeviceId
).outerjoin(
    (ExpiredDeviceId, Notification.device_id == ExpiredDeviceId.device_id)
).filter(
    ???
)
Run Code Online (Sandbox Code Playgroud)

或者我可以用一个device_id NOT IN (SELECT device_id FROM ExpiredDeviceId)子句做到这一点,但这似乎效率低下.

python sql join sqlalchemy

18
推荐指数
1
解决办法
2万
查看次数

表'roles_users'已经为此MetaData实例定义

你好我想在我的视图中获取currnet_user信息

我从users.models导入包含*

然后在我的代码中返回return current_user;

@app.route('/panel')
@login_required
def access_panel():
    return current_user.email;
Run Code Online (Sandbox Code Playgroud)

一旦我运行我的服务器它说

Traceback (most recent call last):
  File "manage.py", line 6, in <module>
    from nadel import app
  File "/Users/tbd/Desktop/Projects/nadel/__init__.py", line 27, in <module>
    from users import views
  File "/Users/tbd/Desktop/Projects/nadel/users/views.py", line 5, in <module>
    from users.models import *
  File "/Users/tbd/Desktop/Projects/nadel/users/models.py", line 8, in <module>
    db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
  File "/Library/Python/2.7/site-packages/flask_sqlalchemy/__init__.py", line 67, in _make_table
    return sqlalchemy.Table(*args, **kwargs)
  File "/Library/Python/2.7/site-packages/sqlalchemy/sql/schema.py", line 398, in __new__
    "existing Table object." % key)
sqlalchemy.exc.InvalidRequestError: Table 'roles_users' is already …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

18
推荐指数
8
解决办法
1万
查看次数

sqlalchemy - 加入包含2个条件的子表

如何在连接2个表时向ON子句添加2个条件.我有3个三层表,每个表都有删除标志.我必须在单个查询中加入所有这些表,并根据已删除的标志进行过滤.目前,条件被添加到查询的where子句中,该子句不会过滤已删除的记录.它需要添加到ON子句中.请建议.

我目前的查询如下:

result = session.query(Host).filter(and_(Host.id.in_(ids), Host.deleted == False)).\
    join(Switch).filter(Switch.deleted == False).\
    join(Port).filter(Port.deleted == False).\
    options(joinedload('switches')).\
    options(joinedload('ports')).\
    all()
Run Code Online (Sandbox Code Playgroud)

谢谢

python sqlalchemy

17
推荐指数
3
解决办法
2万
查看次数

如何在SQLAlchemy中使用FROM对象注释函数元素

在回答另一个问题时,我试图生成一个混合属性,它会返回一个包含标量子查询的函数表达式,该子标点将所有FROM对象与封闭查询相关联,但如果没有其他表达式,它仍会提供一个FROM对象.封闭查询提供要关联的表.

给出玩具模型的定义

class Foo(Base):
    __tablename__ = 'foo'

    foo_id = Column(Integer, primary_key=True, autoincrement=True)
    bar = Column(postgresql.ARRAY(Integer))
    baz = Column(postgresql.ARRAY(Integer))

    @hybrid_property
    def bar_sans_baz(self):
        return list(set(self.bar).difference(self.baz))

    @bar_sans_baz.expression
    def bar_sans_baz(cls):
        bar = func.unnest(cls.bar).select().correlate(cls)
        baz = func.unnest(cls.baz).select().correlate(cls)
        stmt = bar.except_(baz)
        # Uses `func` generic as ARRAY() constructor
        return func.array(stmt.as_scalar(),
                          type_=postgresql.ARRAY(Integer))
Run Code Online (Sandbox Code Playgroud)

问题是

session.query(Foo.bar_sans_baz)
Run Code Online (Sandbox Code Playgroud)

结果是

SELECT array((SELECT unnest(foo.bar) AS unnest_1 
              FROM foo EXCEPT SELECT unnest(foo.baz) AS unnest_2 
              FROM foo)) AS bar_sans_baz
Run Code Online (Sandbox Code Playgroud)

因为它在封闭查询中没有任何关联.一个简单的补救方法是使用select_from()显式添加FROM对象:

session.query(Foo.bar_sans_baz).select_from(Foo)
Run Code Online (Sandbox Code Playgroud)

并且得到的查询是期望的

SELECT array((SELECT unnest(foo.bar) AS unnest_1 …
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy

17
推荐指数
1
解决办法
686
查看次数

在一个sqlalchemy中按年,月,日分组

我想要

DBSession.query(Article).group_by(Article.created.month).all()
Run Code Online (Sandbox Code Playgroud)

但是这个查询无法使用

我如何使用SQLAlchemy执行此操作?

python sqlalchemy

15
推荐指数
3
解决办法
1万
查看次数

如何使用SQLAlchemy只选择一列?

我想仅使用"where子句"从我的数据库中选择(并返回)一个字段.代码是:

from sqlalchemy.orm import load_only
    @application.route("/user", methods=['GET', 'POST'])
    def user():
        user_id = session.query(User, User.validation==request.cookies.get("validation")).options(load_only("id"))
        session.commit()
        return user_id
Run Code Online (Sandbox Code Playgroud)

这失败了,回溯是:

File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Python/2.7/site-packages/flask/app.py", line 1478, in full_dispatch_request
response = self.make_response(rv)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1577, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/Library/Python/2.7/site-packages/werkzeug/wrappers.py", line 841, in force_type
response …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask

15
推荐指数
4
解决办法
4万
查看次数

sqlalchemy:在db中创建关系但没有外键约束?

既然sqlalchemy.orm.relationship()已经暗示了这种关系,我不想在db中创建约束.我该怎么办?

目前我在alembic迁移后手动删除这些约束.

python orm sqlalchemy foreign-keys

15
推荐指数
1
解决办法
7800
查看次数

SqlAlchemy:case语句(case - if - then -else)

我想知道是否有办法case用SqlAlchemy 创建一个语句,例如postgresql版本

如果没有简单的方法,也许文字SQL是要走的路?

python sqlalchemy

14
推荐指数
2
解决办法
2万
查看次数

对JSON字段的更新不会持久保存到DB

我们有一个带有JSON字段的模型,用户标志插入其中.插入确实按预期工作,但是当删除某些标志时,它们会保留在字段中,并且更改不会持久保存到数据库.

我们的模型中有以下方法:

def del_flag(self, key):
    if self.user_flags is None or not key in self.user_flags:
        return False
    else:
        del self.user_flags[key]
        db.session.commit()        
        return True
Run Code Online (Sandbox Code Playgroud)

数据库是postgres,我们使用SQLalchemy JSON字段方言作为字段类型.有什么建议吗?

python postgresql json sqlalchemy flask-sqlalchemy

14
推荐指数
3
解决办法
4848
查看次数

SQLAlchemy中的按位运算符

我如何在SQLAlchemy中编写以下SQL查询,涉及按位和?

select * from table where flags & 1 = 1;
Run Code Online (Sandbox Code Playgroud)

table表名在哪里,并且是该表flags中的列名.

python sqlalchemy

13
推荐指数
1
解决办法
3486
查看次数

标签 统计

python ×10

sqlalchemy ×10

postgresql ×2

flask ×1

flask-sqlalchemy ×1

foreign-keys ×1

join ×1

json ×1

orm ×1

sql ×1