在Perl中编写支持Unicode的单行程序的正确方法是什么?显而易见的方式:
$ echo '????' | perl -lne 'print if /?/'
????
Run Code Online (Sandbox Code Playgroud)
...有点似乎是第一眼看到的,但这只是一个意外:Unicode被解释为字节,如下一个示例所示:
$ echo '???? != ????' | perl -mString::Diff=diff -lne 'print join(" ", diff($1, $2)) if /(.*)!=(.*)/' => 29
??[??]??[ ] { }??{??}??
Run Code Online (Sandbox Code Playgroud)
只使用-C标志将STDIN/ STDOUT 等设置为UTF-8本身是不够的:
$ echo '????' | perl -C -lne 'print if /?/'
[no output]
Run Code Online (Sandbox Code Playgroud)
...因为现在文本-e不被解释为Unicode.
所以这是要走的路(假设一个理智的LOCALE - 即形式中的一个"*.UTF?8"),如下所示:
$ perl -C -Mutf8 [...]
Run Code Online (Sandbox Code Playgroud) 如何完全重置我的Django(1.2 alpha)数据库(丢弃所有表,而不是仅仅清除它们)?
manage.py flush做得太少(如果有架构更改将无法工作)并manage.py reset要求我指定所有应用程序(并且看起来采用的格式与".join(INSTALLED_APPS)"不同).我可以用DB特定的方式实现这一点,但我认为必须有一个理智的,DB后端不可知的方式来做到这一点.
[编辑:我在寻找的东西,我可以从一个脚本,例如一个Makefile调用和继续,如果我改变后端数据库或添加到工作settings.INSTALLED_APPS]
有没有理智的方法来为Windows执行二进制python包的脚本安装?不幸的是,似乎几个必要的Windows python包如pywin32和py2exe只能作为EXE而不是MSI(并且据我所知只有后者是可编写脚本的).Easy_install/pip似乎也没用,因为他们显然只找到源包然后尝试在本地编译,这显然是不能令人满意的.
我错过了什么吗?
通常希望从 SELECT 表达式中插入(例如,使用 WHERE 子句进行限定),但这会使 postgresql 对列类型感到困惑。
例子:
CREATE TABLE example (a uuid primary key, b numeric);
INSERT INTO example
SELECT a, b
FROM (VALUES ('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL)) as data(a,b);
=> ERROR: column "a" is of type uuid but expression is of type text
Run Code Online (Sandbox Code Playgroud)
这可以通过显式转换值来解决:
INSERT INTO example
SELECT a, b
FROM (VALUES ('d853b5a8-d453-11e7-9296-cec278b6b50a'::uuid, NULL::numeric)) as data(a,b);
Run Code Online (Sandbox Code Playgroud)
但这很麻烦,而且是维护负担。有什么方法可以让 postgres 理解 VALUES 表达式与表行具有相同的类型,即类似于
VALUES('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL)::example%ROWTYPE
Run Code Online (Sandbox Code Playgroud)
编辑:
使用 (data::example).* 的建议很简洁,但不幸的是,当与 WHERE 子句结合使用时,它似乎完全搞砸了 postgres 查询规划器,如下所示:
INSERT INTO example
SELECT (data::example).*
FROM (VALUES ('d853b5a8-d453-11e7-9296-cec278b6b50a', NULL)) …Run Code Online (Sandbox Code Playgroud) 我想要类似的东西
INSERT VALUES(1,2,3) INTO sometable ON CONFLICT DO NOTHING IF EXACTLY SAME ROW
Run Code Online (Sandbox Code Playgroud)
所以我想要以下行为:
#CREATE TABLE sometable (a int primary key, b int, c int);
CREATE TABLE
#INSERT INTO sometable (1,2,3) ON CONFLICT DO NOTHING IF EXACTLY SAME ROW
INSERT 0 1
#INSERT INTO sometable (1,2,3) ON CONFLICT DO NOTHING IF EXACTLY SAME ROW
INSERT 0 0
#INSERT INTO sometable (1,3,2) ON CONFLICT DO NOTHING IF EXACTLY SAME ROW
ERROR: duplicate key value violates unique constraint "sometable_pkey"
DETAIL: Key (a)=(1) …Run Code Online (Sandbox Code Playgroud)