我正在使用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) 我有一个简单的音乐模式:艺术家,发行,曲目和歌曲.前3个是所有逻辑结构,而第四个(Song)是(Artist,Release,Track)的特定实例,如mp3,wav,ogg等等.
我在数据库中生成有序的歌曲列表时遇到问题.美中不足的是,双方Track并Release有一个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)
我的查询应该相当简单; …
我正在寻找一种有效的方法来存储在事件期间一起发生的对象集合,这样我就可以每天在它们上生成聚合统计数据.
举一个例子,让我们想象一个跟踪办公室会议的系统.对于每次会议,我们会记录它的长度以及它在哪个房间.
我希望按人和房间分析统计数据.我不需要跟踪个别会议(所以没有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) 我的脚本接受 stdin 上的流。无论如何,我都想将第一行传递给标准输出,并用 grep 剩余的行-v并将它们传递给标准输出。
我使用 tee 制定了一个解决方案,但我想知道这是否保证总是head在grep? 如果head在打印任何内容之前替换为阻塞 20 分钟的内容,该输出是否会出现在输出之后的 stdout 末尾grep?
tee >(head -n 1) >(tail -n +2 | grep -v -E "$PATTERN")
Run Code Online (Sandbox Code Playgroud)
如果无法保证订单,那么正确的做法是什么?
我想配置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) 将鼠标悬停在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) 当我在firefox扩展中调用setTimeout时会发生什么?是否存在可以同时运行多个回调的情况?
我的firefox扩展包含一系列我想截取屏幕截图的URL.我的扩展程序打开5个选项卡,并将这些选项卡的URL设置为数组中的前5个URL.一旦页面在标签N中完成加载,我想等待30秒,截取屏幕截图,然后弹出数组中的下一个URL并将其加载到选项卡N.该过程重复进行,直到URL列表为空.
如何确保每个URL只处理一次?如果我在java中写这个,我只会同步所有访问我的URL列表.如何在Firefox扩展程序中实现此目的?
是否有区别:
$ 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 ×2
analytics ×1
api-design ×1
database ×1
django ×1
firefox ×1
foreign-keys ×1
glob ×1
jquery ×1
logrotate ×1
python ×1
shell ×1
sql-order-by ×1
sqlalchemy ×1
tee ×1