使用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)子句做到这一点,但这似乎效率低下.
你好我想在我的视图中获取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) 如何在连接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)
谢谢
在回答另一个问题时,我试图生成一个混合属性,它会返回一个包含标量子查询的函数表达式,该子标点将所有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) 我想要
DBSession.query(Article).group_by(Article.created.month).all()
Run Code Online (Sandbox Code Playgroud)
但是这个查询无法使用
我如何使用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) 既然sqlalchemy.orm.relationship()已经暗示了这种关系,我不想在db中创建约束.我该怎么办?
目前我在alembic迁移后手动删除这些约束.
我想知道是否有办法case用SqlAlchemy 创建一个语句,例如postgresql版本
如果没有简单的方法,也许文字SQL是要走的路?
我们有一个带有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字段方言作为字段类型.有什么建议吗?
我如何在SQLAlchemy中编写以下SQL查询,涉及按位和?
select * from table where flags & 1 = 1;
Run Code Online (Sandbox Code Playgroud)
table表名在哪里,并且是该表flags中的列名.
python ×10
sqlalchemy ×10
postgresql ×2
flask ×1
foreign-keys ×1
join ×1
json ×1
orm ×1
sql ×1