小编Ovi*_*vid的帖子

在Postgresql中插入自引用记录

鉴于PostgreSQL中的下表,如何插入引用自身的记录?

CREATE TABLE refers (
    id        SERIAL  PRIMARY KEY,
    name      VARCHAR(255) NOT NULL,
    parent_id INTEGER      NOT NULL,
    FOREIGN KEY (parent_id) REFERENCES refers(id)
);
Run Code Online (Sandbox Code Playgroud)

我在Web上找到的示例允许parent_id为NULL,然后使用触发器来更新它.如果可能的话,我宁愿一次更新.

postgresql

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

锁定和Redis

我们有75台(并且还在增长)需要通过Redis共享数据的服务器.理想情况下,所有75台服务器都希望通过操作写入Redis中的两个字段INCRBYFLOAT.我们预计这两个领域最终可能有数百万的日常写入操作和数十亿日常读取.这些数据必须是持久的.

我们担心Redis锁定可能导致重复重写写操作,同时尝试增加同一个字段.

问题:

  • INCRBYFLOAT在一个非常重的负载下,单个字段上的多个同时是一个坏主意吗?
  • 我们是否应该让外部流程"汇总"单独的字段并写入两个字段?(这引入了另一个失败点)
  • 这两个字段的读取会在写入时阻塞吗?

scalability locking redis

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

检测Perl中的重写方法

上周,我在一个子类中意外地重写方法时被咬了两次.虽然我不是继承的粉丝,但我们(ab)在我们的应用程序中使用它.我想要做的是提供一些声明性语法来声明方法覆盖父方法.像这样的东西:

use Attribute::Override;

use parent 'Some::Class';

sub foo : override { ... } # fails if it doesn't override
sub bar { ... }            # fails if it does override
Run Code Online (Sandbox Code Playgroud)

这里有几个问题.首先,如果方法加载以某种方式延迟(例如,通过AUTOLOAD加载的方法或稍后安装在符号表中的方法),则不会检测这些方法.

走继承树也可能同样昂贵.我用Class :: Sniff做这个,但它不适合运行代码.我可以遍历继承树并简单地匹配适当的符号表中定义的CODE插槽的位置,并且会更快,但如果方法缓存无效,那么如果我要缓存这些结果,那将会中断.

所以我有两个问题:这是一个合理的方法,是否有一个钩子,允许我检查方法缓存是否已更改?(在'perldoc perlobj'中搜索'cache').

当然,这不应该破坏生产代码,我只考虑让它失败或警告TEST_HARNESS环境变量是否处于活动状态(并且有一个显式环境变量来强制它处于非活动状态,如果生产代码是设置TEST_HARNESS由于某种原因的环境变量).

oop methods perl overriding

9
推荐指数
1
解决办法
759
查看次数

为什么Test :: WWW :: Mechanize :: PSGI使用端口?

我有一些看起来像这样的代码:

use SomeApp;
use Test::WWW::Mechanize::PSGI;                                                                                                                                         
my $mech = Test::WWW::Mechanize::PSGI->new(
    app  => sub { SomeApp->run(@_) },
);
$mech->get_ok('/');
Run Code Online (Sandbox Code Playgroud)

但是,一旦get_ok()调用,我收到以下警告:

PSGI error: failed to listen to port 8080: Address already in use at .../5.18.1/HTTP/Server/PSGI.pm line 94.
HTTP::Server::PSGI::setup_listener('HTTP::Server::PSGI=HASH(0x7fe6622fad60)') called at .../5.18.1/HTTP/Server/PSGI.pm line 54
Run Code Online (Sandbox Code Playgroud)

是的,我正在使用那个端口做其他事情.来自Test :: WWW :: Mechanize :: PSGI的文档:

此模块允许您测试PSGI Web应用程序,但不需要服务器或发出HTTP请求.相反,它将HTTP请求对象直接传递给PSGI.

所以从理论上讲,我不需要指定一个端口,但是我得到了上面的警告,并且获取的页面返回了500(它们在浏览器中工作正常).我错过了什么?

  • 测试:: WWW :: Mechanize :: PSGI版本0.35
  • Plack版本1.0030
  • Catalyst版本5.90051

更改MyApp->runMyApp->psgi_app结果:

Can't call method "request" on an undefined value at .../5.18.1/Test/WWW/Mechanize/PSGI.pm line 47.
Run Code Online (Sandbox Code Playgroud)

可以使用以下命令复制此错误: …

perl catalyst plack psgi

9
推荐指数
1
解决办法
503
查看次数

Jquery自动完成:使用选项卡选择第一个项目并保持对搜索框的关注

当我使用JQuery UI自动完成时,我需要使用tab键填充搜索框,其中包含自动完成结果中的第一项,之后包含空格,然后允许用户继续键入.

<div class="ui-widget">
  <form id="searchbox" method="GET" action="http://duckduckgo.com/">
    <input id="search" type="text" name="q">
    <input id="submit" type="submit" value="Search">
  </form>
</div>
<script>
var tabKey = 9;
$('#search').autocomplete({
    source: [ 'this', 'that', 'foobar' ],
    delay: 0,
    selectFirst: true,
    select: function(event, ui) { if (event.keyCode == tabKey) { 
      $('#search').focus().select();
    } }
});
// without this, the tab key doesn't trigger an event                                                                                       
$('.ui-autocomplete').keypress(function(event) {});
</script>
Run Code Online (Sandbox Code Playgroud)

换句话说,在上面的例子中,如果有人输入"th",他们会在自动完成选项中看到"this"和"that".点击选项卡会将"this"(注意空格)添加到输入,焦点将保留在输入中.

有人可以给我一个关于我错过了什么的指针吗?我不太了解Javascript,所以小字很好:)

也许更多有用的信息(jquery 1.7.2)来自HEAD部分:

<script src="js/jquery-latest.js"></script>
<script src="js/jquery-ui-1.8.20.custom.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/jquery-ui-1.8.20.custom.css" /> 
Run Code Online (Sandbox Code Playgroud)

编辑:似乎autoFocus: true会让我在那里.现在,如果我能弄清楚如何将焦点放在输入框上.

jquery jquery-ui autocomplete

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

如何在Perl中干净地提取MySQL枚举值?

我有一些代码需要确保在插入数据库之前某些数据在mysql枚举中.我发现这样做最干净的方法是以下代码:

sub enum_values {
    my ( $self, $schema, $table, $column ) = @_;

    # don't eval to let the error bubble up
    my $columns = $schema->storage->dbh->selectrow_hashref(
        "SHOW COLUMNS FROM `$table` like ?",
        {},
        $column
    );

    unless ($columns) {
        X::Internal::Database::UnknownColumn->throw(
            column => $column,
            table  => $table,
        );
    }

    my $type = $columns->{Type} or X::Panic->throw(
        details => "Could not determine type for $table.$column",
    );

    unless ( $type =~ /\Aenum\((.*)\)\z/ ) {
        X::Internal::Database::IncorrectTypeForColumn->throw(
            type_wanted => 'enum',
            type_found  => $type,
        );
    }
    $type = …
Run Code Online (Sandbox Code Playgroud)

mysql perl enums dbix-class

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

如何使用外部数据过滤DBIX :: Class结果集?

使用DBIx :: Class,我有一个结果集,需要通过SQL无法生成的数据进行过滤.我需要做的是有效地等同于这个假设的例子:

my $resultset     = $schema->resultset('Service')->search(\%search);
my $new_resultset = $resultset->filter( sub {
    my $web_service = shift;
    return $web_service->is_available;
} );
Run Code Online (Sandbox Code Playgroud)

阅读文档让我不知道如何完成这样的策略.

perl dbix-class

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

DBI:如果第一个数据库不存在,则连接到其他数据库

我正在尝试对一些有两个用途的遗留代码进行排序.它使用DBI 创建数据库,然后使用DBI 连接到该数据库.不幸的是,它为每个使用相同的代码.这意味着如果您创建sales数据库,稍后在使用重新连接时,您必须显式调用$dbh->do('use sales').这会导致各种各样的问题,例如开发人员忘记这样做或数据库处理重新连接并忘记它所在的数据库.

我们作为第一次修复尝试做的是如果数据库不存在则DBI::connect()使用该方法HandleError重新连接到MySQL,从而允许我们创建数据库.由于各种遗留原因(是的,我们都在那里),尝试在connect()方法之外捕获"未知数据库"错误要困难得多.

因此,我解决这个问题的第一步如下:

use strict;                                                                                                                                               
use warnings;
use DBI;
use PadWalker 'peek_my';
my $dbh = DBI->connect(
    $dsn,
    $user,
    $pass,
    {   RaiseError  => 1,
        PrintError  => 0,
        HandleError => \&reconnect_if_unknown_database,
    },
);

sub reconnect_if_unknown_database {
    my ($msg, $drh, $dbh) = @_;
    return unless $msg =~ /Unknown database/;

    my ($dsn, $user, $pass, $attr) = @{peek_my(1)}{qw/$dsn $user $pass $attr/};

    unless ($dsn && $user && $pass && $attr) { …
Run Code Online (Sandbox Code Playgroud)

mysql perl dbi

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

perlipc文档出错?

我试图通过perlipc文档中看到的东西来解决问题.

如果你正在写一个管道,你也应该陷入SIGPIPE.否则,想一想当你启动一个不存在的命令时会发生什么:open()很可能会成功(它只反映fork()的成功),但是你的输出会失败 - -spectacularly.Perl无法知道命令是否有效,因为您的命令实际上是在exec()可能失败的单独进程中运行的.因此,虽然伪造命令的读者只返回文件的快速结束,但伪造命令的编写者将触发他们最好准备处理的信号.考虑:

   open(FH, "|bogus")  or die "can't fork: $!";
   print FH "bang\n"   or die "can't write: $!";
   close FH            or die "can't close: $!";
Run Code Online (Sandbox Code Playgroud)

直到收盘时才会爆炸,并且它会以SIGPIPE炸毁.要抓住它,你可以使用这个:

   $SIG{PIPE} = 'IGNORE';
   open(FH, "|bogus")  or die "can't fork: $!";
   print FH "bang\n"   or die "can't write: $!";
   close FH            or die "can't close: status=$?";
Run Code Online (Sandbox Code Playgroud)

如果我正确地阅读它,它说第一个版本可能不会在最后关闭之前死掉.

但是,我的OS X盒子上没有发生这种情况(Perl版本5.8.9到5.15.9).open无论我是否有$ SIG {PIPE}行,它都会在"无法分叉:没有这样的文件或目录" 上爆炸.

我有什么误会?

perl ipc

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

为什么JSON :: XS不生成有效的UTF-8?

我收到了一些损坏的JSON,我把它简化为这个测试用例.

use utf8;
use 5.18.0;
use Test::More;
use Test::utf8;
use JSON::XS;

BEGIN {
    # damn it
    my $builder = Test::Builder->new;
    foreach (qw/output failure_output todo_output/) {
        binmode $builder->$_, ':encoding(UTF-8)';
    }
}

foreach my $string ( 'Deliver «French Bread»', '???' ) {
    my $hashref = { value => $string };
    is_sane_utf8 $string, "String: $string";
    my $json = encode_json($hashref);
    is_sane_utf8 $json, "JSON: $json";
    say STDERR $json;
}
diag ord('»');

done_testing;
Run Code Online (Sandbox Code Playgroud)

这是输出:

utf8.t .. 
ok 1 - String: Deliver «French Bread»
not ok 2 …
Run Code Online (Sandbox Code Playgroud)

perl json utf-8

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