如何执行WITHsqlalchemy 中使用的SQL查询?
WITH foo AS (...), bar as (...) SELECT (...)
Run Code Online (Sandbox Code Playgroud)
http://www.postgresql.org/docs/9.1/static/queries-with.html
使用postgres.
似乎SQLAlchemy的最大缺点是在处理临时表时需要几个步骤.例如,一个非常常见的用例是创建一个特定于一个任务的临时表,在其中抛出一些数据,然后加入它.
对于初学者来说,声明一个临时表是冗长的,并且是有限的.请注意,在这个例子中我必须编辑它,因为我的类实际上继承了一个基类,所以我在这里给出的可能稍微不正确.
@as_declarative(metaclass=MetaBase)
class MyTempTable(object):
__tablename__ = "temp"
__table_args__ = {'prefixes': ['TEMPORARY']}
id = Column(Integer(), primary_key=True)
person_id = Column(BigInteger())
a_string = Column(String(100))
Run Code Online (Sandbox Code Playgroud)
创建它是不直观的:
MyTempTable.__table__.create(session.bind)
Run Code Online (Sandbox Code Playgroud)
除非我做一些有创意的事情来使用ON COMMIT DROP进行渲染,否则我还必须记住明确删除它:
MyTempTable.__table__.drop(session.bind)
Run Code Online (Sandbox Code Playgroud)
而且,除非临时表完成"顶级",否则我刚刚给出的内容甚至不起作用.我还没有完全弄明白(因为不想花时间调查它为什么不起作用),但基本上我尝试使用session.begin_nested()和你在嵌套事务中以这种方式创建一个临时表最终得到一个错误,说该关系不存在.但是,我有几种情况我在嵌套事务中创建临时表以进行单元测试,它们工作得很好.检查回声输出,看来差别在于一个在BEGIN语句之前呈现,而另一个在它之后呈现.这是使用Postgresql.
什么在嵌套事务中工作,并且坦率地为您节省了大量时间,就是输入该死的sql并使用session.execute执行它.
session.execute(text(
"CREATE TEMPORARY TABLE temp ("
" id SERIAL,"
" person_id BIGINT,"
" a_string TEXT"
") ON COMMIT DROP;"
))
Run Code Online (Sandbox Code Playgroud)
当然,如果你这样做,你仍然需要一个相应的表模型来使用ORM功能,或者必须坚持使用原始的SQL查询,这首先会破坏SQLAlchemy的目的.
我想知道我是否在这里遗漏了一些东西,或者有人提出了一个更优雅的解决方案.
有没有一个 python 日期时间库可以做到这一点?
dt = iso8601.parse_date("2016-03-13 00:00:00-08")
dt = dt.astimezone(us_pacific)
dt += timedelta(days=1)
self.assertEqual(dt, iso8601.parse_date("2016-03-14 00:00:00-07"))
Run Code Online (Sandbox Code Playgroud)
换句话说,我正在寻找一个库,其中 datetime 对象足够智能,可以知道 timedelta(days=1) 与 timedelta(hours=24) 不同(支持月份的奖励积分)。
目前,我发现错误风险最小的解决方法是使用日期,然后将其转换为日期时间,并将给定时区的时间设置为 0。但问题是,很容易假设上面的代码将按给定的方式工作,所以我想使用一个不存在风险的库。同样,如果给定一个日期时间对象,则将其转换回日期会很麻烦。
编辑:
这个问题被搁置了,因为询问是否有一个软件库可以完成一项任务,而不是必须从头开始编写代码,这是题外话。我不知道如何更好地表达,因为我已经解释过解决方法是使用日期,然后添加时间,这可以通过多种方式完成。我正在寻找一种更好的方法,我已经知道它不是 python 标准库的一部分。我很确定会问“有没有更好的方法来做到这一点?”,或者“我怎样才能在大约相同数量的代码行中完成这个任务?” 也是完全有效的问题。
如果没有图书馆做这样的事情,我当然可以做到。我将其称为 YADateTime,因为它将是另一个 python 日期时间库。也就是说,如果已经有一个库,那么我就没有必要再创建一个。
我正在尝试使用Django REST框架找到遇到此问题的优雅解决方案.我们有一个带有子对象和一对一关系的父模型.我们的要求是子对象是可选的,可以为null,也可以从先前存在的值修补为null.此外,如果删除父对象,则子对象也应该是.
这个简单的设置可以重现问题:
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
class ParentSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Parent
parent_value = serializers.CharField(required=False, max_length=1024)
child = ChildSerializer(read_only=False, required=False, many=False)
class Parent(models.Model):
class Meta:
app_label = "testparent"
parent_value = models.CharField(max_length=1024, null=True, blank=True)
class Child(models.Model):
class Meta:
app_label = "testparent"
child_value = models.CharField(max_length=1024, null=True, blank=True)
parent = models.ForeignKey(Parent, null=True, blank=True, related_name="child")
class ParentViewSet(viewsets.ModelViewSet):
permission_classes = (AllowAny,)
queryset = Parent.objects.all()
serializer_class = ParentSerializer
Run Code Online (Sandbox Code Playgroud)
这有效:
{
"parent_value": "abc",
"child": { "child_value": "something" }
}
Run Code Online (Sandbox Code Playgroud)
这会出错:
{
"parent_value": …Run Code Online (Sandbox Code Playgroud) 在 Google App Engine 标准环境中,如果您使用 urllib 发出 HTTPS 请求,您将收到一条消息,AppEnginePlatformWarning表明您正在使用 urlfetch 而不是套接字。
我发现这个警告很烦人,所以我禁用了它。
# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()
# squelch warning
requests.packages.urllib3.disable_warnings(
requests.packages.urllib3.contrib.appengine.AppEnginePlatformWarning
)
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 有充分的理由切换到套接字吗?具体来说,使用 urlfetch 有什么问题?
我正在使用 python 标准环境并想向 google pub/sub 发布消息。然而,谷歌云库似乎不包含在环境中,至少没有某种额外的配置。
from google.cloud import pubsub
ImportError: No module named cloud
Run Code Online (Sandbox Code Playgroud)
这是在已部署的实例上运行。谷歌给出的使用发布/订阅的例子是在灵活的环境中。