小编Jam*_*son的帖子

10
推荐指数
1
解决办法
2962
查看次数

SQLAlchemy临时表痛苦的解决方案?

似乎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 postgresql sqlalchemy temp-tables

10
推荐指数
1
解决办法
3636
查看次数

Python 日期时间库在向日期时间添加天数时可识别夏令时

有没有一个 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 日期时间库。也就是说,如果已经有一个库,那么我就没有必要再创建一个。

python datetime

7
推荐指数
1
解决办法
1053
查看次数

django rest框架嵌套对象

我正在尝试使用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)

python django rest django-rest-framework

5
推荐指数
1
解决办法
2344
查看次数

AppEnginePlatformWarning - 使用套接字的原因?

在 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 sockets google-app-engine python-requests

5
推荐指数
1
解决办法
443
查看次数

从 App Engine 标准环境访问 Google Pub/Sub?

我正在使用 python 标准环境并想向 google pub/sub 发布消息。然而,谷歌云库似乎不包含在环境中,至少没有某种额外的配置。

from google.cloud import pubsub
ImportError: No module named cloud
Run Code Online (Sandbox Code Playgroud)

这是在已部署的实例上运行。谷歌给出的使用发布/订阅的例子是在灵活的环境中。

python google-app-engine google-cloud-pubsub

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