小编Rob*_*ell的帖子

将LIMIT和OFFSET应用于SQLAlchemy中的所有查询

我正在使用SQLAlchemy(查询MySQL)设计API,我想强制所有查询都有page_size(LIMIT)和page_number(OFFSET)参数.

使用SQLAlchemy是否有一种干净的方法?也许构建某种工厂来创建自定义Query对象?或者也许有一个很好的方法来使用mixin类吗?

我尝试了显而易见的事情并且它不起作用,因为.limit()和.offset()必须在应用所有过滤条件后调用:

def q(page=0, page_size=None):
    q = session.query(...)
    if page_size: q = q.limit(page_size)
    if page: q = q.offset(page*page_size)
    return q
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它时,我得到了例外:

sqlalchemy.exc.InvalidRequestError: Query.filter() being called on a Query which already has LIMIT or OFFSET applied. To modify the row-limited results of a  Query, call from_self() first.  Otherwise, call filter() before limit() or offset() are applied.
Run Code Online (Sandbox Code Playgroud)

python api-design sqlalchemy

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

Django ORM - 使用外键select_related和order_by

我有一个简单的音乐模式:艺术家,发行,曲目和歌曲.前3个是所有逻辑结构,而第四个(Song)是(Artist,Release,Track)的特定实例,如mp3,wav,ogg等等.

我在数据库中生成有序的歌曲列表时遇到问题.美中不足的是,双方TrackRelease有一个Artist.虽然Song.Track.Artist总是表演者的名字,但Song.Track.Release.Artist可能是表演者的名字,也可能是"各种艺术家"的编辑.我希望能够按其中一种排序,我无法弄清楚这项工作的正确方法.

这是我的架构:

class Artist(models.Model):
    name = models.CharField(max_length=512)

class Release(models.Model):
    name = models.CharField(max_length=512)
    artist = models.ForeignKey(Artist)

class Track(models.Model):
    name = models.CharField(max_length=512)
    track_number = models.IntegerField('Position of the track on its release')
    length = models.IntegerField('Length of the song in seconds')
    artist = models.ForeignKey(Artist)
    release = models.ForeignKey(Release)

class Song(models.Model):
    bitrate = models.IntegerField('Bitrate of the song in kbps')
    location = models.CharField('Permanent storage location of the file', max_length=1024)
    owner = models.ForeignKey(User)
    track = models.ForeignKey(Track)
Run Code Online (Sandbox Code Playgroud)

我的查询应该相当简单; …

django foreign-keys sql-order-by django-select-related

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

如何存储在事件期间一起发生的对象集?

我正在寻找一种有效的方法来存储在事件期间一起发生的对象集合,这样我就可以每天在它们上生成聚合统计数据.

举一个例子,让我们想象一个跟踪办公室会议的系统.对于每次会议,我们会记录它的长度以及它在哪个房间.

我希望按人和房间分析统计数据.我不需要跟踪个别会议(所以没有meeting_id或类似的东西),我想知道的是每日汇总信息.在我的实际应用程序中,每天有数十万个事件,因此单独存储每个事件是不可行的.

我希望能够回答以下问题:

2012年,Bob,Sam和Julie在每个会议室花了多少分钟(不一定在一起)?

使用3个查询执行此操作可能很好:

>>> query(dates=2012, people=[Bob])
{Board-Room: 35, Auditorium: 279}
>>> query(dates=2012, people=[Sam])
{Board-Room: 790, Auditorium: 277, Broom-Closet: 71}
>>> query(dates=2012, people=[Julie])
{Board-Room: 190, Broom-Closet: 55}
Run Code Online (Sandbox Code Playgroud)

2012年,Sam和Julie在每个会议室共聚会多少分钟?Bob,Sam和Julie在一起怎么样?

>>> query(dates=2012, people=[Sam, Julie])
{Board-Room: 128, Broom-Closet: 55}
>>> query(dates=2012, people=[Bob, Sam, Julie])
{Board-Room: 22}
Run Code Online (Sandbox Code Playgroud)

2012年,每个人在董事会会议室花了多少分钟?

>>> query(dates=2012, rooms=[Board-Room])
{Bob: 35, Sam: 790, Julie: 190}
Run Code Online (Sandbox Code Playgroud)

2012年,董事会会议室使用了多少分钟?

这实际上非常困难,因为总结每个人花费的分钟数的天真策略将导致严重的过度计算.但我们可以通过将数字分别存储为元人来解决这个问题任何人:

>>> query(dates=2012, rooms=[Board-Room], people=[Anyone])
865
Run Code Online (Sandbox Code Playgroud)

我可以使用哪些好的数据结构或数据库来启用这种查询?由于我的应用程序的其余部分使用MySQL,我很想定义一个字符串列,其中包含会议中每个人的(已排序)ID,但此表的大小会很快增长:

2012-01-01 | "Bob"           | "Board-Room" | 2
2012-01-01 | "Julie"         | "Board-Room" | 4
2012-01-01 …
Run Code Online (Sandbox Code Playgroud)

database analytics database-design data-structures

6
推荐指数
1
解决办法
150
查看次数

在 bash 脚本中多次使用 stdin

我的脚本接受 stdin 上的流。无论如何,我都想将第一行传递给标准输出,并用 grep 剩余的行-v并将它们传递给标准输出。

我使用 tee 制定了一个解决方案,但我想知道这是否保证总是headgrep? 如果head在打印任何内容之前替换为阻塞 20 分钟的内容,该输出是否会出现在输出之后的 stdout 末尾grep

tee >(head -n 1) >(tail -n +2 | grep -v -E "$PATTERN")
Run Code Online (Sandbox Code Playgroud)

如果无法保证订单,那么正确的做法是什么?

bash tee

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

带有logrotate的文件名glob选项

我想配置logrotate来处理/var/log/apache2/access.log,与写入/ var/log/apache2的所有其他日志文件分开处理.如果没有明确指定所有其他日志,有没有办法让它工作?

我在网上看到logrotate使用glob来模式匹配文件名,但我似乎无法编写正确的模式.我尝试过很多模式,但它们都错误:

considering log /var/log/apache2/!(access.log)
  log /var/log/apache2/!(access.log) does not exist -- skipping
Run Code Online (Sandbox Code Playgroud)

上面的模式在bash中有效,但只能用于shopt -s extglob.有没有办法用logrotate执行此操作,没有apache将access.log写入其自己的目录,或者破坏非访问日志文件的名称?

我也尝试通过使用在尝试旋转时失败的prerotate脚本来实现此功能access.log,但是logrotate抱怨我正在尝试将access.log旋转两次:

error: /etc/logrotate.d/apache2:16 duplicate log entry for /var/log/apache2/access.log
Run Code Online (Sandbox Code Playgroud)

这是我得到的最接近的:

# rotate access.log every time logrotate is called
/var/log/apache2/access.log {
    missingok
    rotate 168
    compress
    create 640 root adm

    # rotate the log every time we call logrotate (size 0)
    size 0
    dateext
    dateformat .%Y%m%d.%s
    copytruncate
}

# rotate everything daily EXCEPT access.log
/var/log/apache2/*.log {
    daily
    missingok
    rotate 7
    compress
    create 640 …
Run Code Online (Sandbox Code Playgroud)

glob logrotate

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

仅在Internet Explorer中中止ajax调用时出现jQuery错误

将鼠标悬停在jcarousel中的图像上时,我的网站会显示一个弹出窗口,其内容通过ajax加载.我正在做我认为相当简单的事情; 保留xhrRequest对象的句柄,并在发出新请求之前中止现有对象.

它在除IE之外的所有浏览器中都很好用,我收到错误"对象不支持此属性或方法"

这是触发它的代码:

function showPopup {
  // ... code snipped ...

  // cancel the existing xhr request
  if (showPopup.xhrRequest != null) {
    showPopup.xhrRequest.abort();
    showPopup.xhrRequest = null;
  }

  showPopup.xhrRequest = $.ajax({url: url, 
                                 type: "GET",
                                 success:function(data) {
                                   $("#popup-content").html(data);
                                 }
                                });

  // ... code snipped ...
}
showPopup.xhrRequest = null;
Run Code Online (Sandbox Code Playgroud)

适用于Firefox和Chrome.我将错误追溯到ajax函数内的jquery.js中的这段代码(我的jQuery副本中的第5233行):

// Override the abort handler, if we can (IE doesn't allow it, but that's OK)
// Opera doesn't fire onreadystatechange at all on abort
try {
  var oldAbort = xhr.abort;
  xhr.abort …
Run Code Online (Sandbox Code Playgroud)

jquery xmlhttprequest

4
推荐指数
1
解决办法
6365
查看次数

在Firefox扩展中使用setTimeout的竞争条件?

当我在firefox扩展中调用setTimeout时会发生什么?是否存在可以同时运行多个回调的情况?

我的firefox扩展包含一系列我想截取屏幕截图的URL.我的扩展程序打开5个选项卡,并将这些选项卡的URL设置为数组中的前5个URL.一旦页面在标签N中完成加载,我想等待30秒,截取屏幕截图,然后弹出数组中的下一个URL并将其加载到选项卡N.该过程重复进行,直到URL列表为空.

如何确保每个URL只处理一次?如果我在java中写这个,我只会同步所有访问我的URL列表.如何在Firefox扩展程序中实现此目的?

firefox firefox-addon race-condition

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

将脚本输送到 bash 中?

是否有区别:

$ bash ~/script.sh
Run Code Online (Sandbox Code Playgroud)

和:

$ cat ~/script.sh | bash
Run Code Online (Sandbox Code Playgroud)

他们的行为似乎略有不同,我无法弄清楚发生了什么。我script.sh的 bash 包含多行,但是当我将其通过管道传输到 bash 时它似乎提前中止(但是当我直接运行脚本时它会运行到完成)。

这两种方式运行脚本有什么区别?

此外,当我使用 时<,行为与第一个示例相同(运行至完成):

bash <( ~/script.sh )
Run Code Online (Sandbox Code Playgroud)

该脚本是沿着

set -eux
ssh CLUSTER_0_SERVER_0 "do_something" || ssh CLUSTER_0_SERVER_1 "do_something"
ssh CLUSTER_1_SERVER_0 "do_something" || ssh CLUSTER_1_SERVER_1 "do_something"
Run Code Online (Sandbox Code Playgroud)

bash shell

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