小编Wic*_*man的帖子

使用UTC中的当前时间作为PostgreSQL中的默认值

我有一个TIMESTAMP WITHOUT TIME ZONE类型的列,并希望默认为UTC当前时间.以UTC格式获取当前时间很简单:

postgres=# select now() at time zone 'utc';
          timezone          
----------------------------
 2013-05-17 12:52:51.337466
(1 row)
Run Code Online (Sandbox Code Playgroud)

与使用列的当前时间戳一样:

postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
             ts             
----------------------------
 2013-05-17 14:54:33.072725
(1 row)
Run Code Online (Sandbox Code Playgroud)

但那使用当地时间.尝试将其强制为UTC会导致语法错误:

postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR:  syntax error at or near "at"
LINE 1: ...int, ts timestamp without …
Run Code Online (Sandbox Code Playgroud)

postgresql timezone timestamp

151
推荐指数
5
解决办法
12万
查看次数

Python C API:打开PyObject类型

我有一些代码可以将Python与C++接口,但是每次看到它我都认为必须有更好的方法.在C++方面,有一个'variant'类型可以处理固定范围的基本类型 - int,real,string,variant变量等.我有一些代码使用Python API从等效的Python类型转换.它看起来像这样:

variant makeVariant(PyObject* value)
{  
  if (PyString_Check(value)) {
    return PyString_AsString(value);
  }
  else if (value == Py_None) {
    return variant();
  }
  else if (PyBool_Check(value)) {
    return value == Py_True;
  }
  else if (PyInt_Check(value)) {
    return PyInt_AsLong(value);
  }
  else if (PyFloat_Check(value)) {
    return PyFloat_AsDouble(value);
  }
  // ... etc
Run Code Online (Sandbox Code Playgroud)

问题是链式if-else ifs.它似乎是在调用switch语句,或者由类型标识符键入的创建函数的表或映射.换句话说,我希望能够写出如下内容:

  return createFunMap[typeID(value)](value);
Run Code Online (Sandbox Code Playgroud)

基于API文档的略读,直接获取'typeID'的最佳方法并不明显.我知道我可以这样做:

  PyTypeObject* type = value->ob_type;
Run Code Online (Sandbox Code Playgroud)

这显然让我快速了解类型信息,但是使用它与我感兴趣的有限类型集相关的最简洁方法是什么?

c python python-c-api python-c-extension

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

如何正确构建 SQLAlchemy(声明式)python 项目及其单元测试

我正在为一些网络应用程序开发大型后端。这是我的第一个 python 和 SQLAlchemy 项目,所以我对一些事情感到困惑。与 python 相比,有点被 Java 编程工具和 IDE 宠坏了(反正我在 eclipse 中使用 pydev)。我需要有关如何构建项目和编写测试的帮助。我先描述一下情况。

在 PyDev 中,我将我的项目命名为“ProjectName”,下面我显示了我当前的文件夹/包和文件结构。

  • 项目名
    • 项目名
      • __init__.py
      • some_package
        • __init__.py
        • 文件
        • 酒吧.py
    • 测试
      • 单元测试
        • __init__.py
        • some_package
          • __init__.py
          • 测试文件
          • 测试条
      • 负载测试
      • 集成测试
      • __init__.py

我在 SQLAlchemy 中使用声明式风格。Foo 和 Bar 是一些类,例如 Foo 扩展 SQLAlchemy 声明性 Base 和 Bar 扩展 Foo。在它的 __init__.py 中的“projectname.some_package”下,我有以下代码:

engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/SomeDataBase', pool_recycle=3600)
Session = sessionmaker(bind=engine)
Base = declarative_base()
Run Code Online (Sandbox Code Playgroud)

因此,Foo 导入此 Base 并扩展它,而 Bar 导入 Foo 并扩展它。我的第一个问题是,我应该将 Base 存储在 __init__.py 中并像我开始使用这两个类一样使用它吗?这个 create_engine 只是临时的,我想要配置文件并从那里加载它的设置,怎么做?我应该在哪里调用 Base.metadata.create_all(),以便它可以一次创建所有数据库表?

接下来,在测试类中,例如在 TestFoo 中,我有以下代码:

def …
Run Code Online (Sandbox Code Playgroud)

python testing unit-testing sqlalchemy

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

使用boost.python从UTF-8编码的char*返回python unicode实例

我正在尝试做一些应该非常简单的事情,但是我没有太多的运气来弄清楚现有文档中的内容.

对于python 2项目,我试图将列表gettext-translated字符串作为unicode实例返回给python.gettext()的返回值是一个UTF-8编码的char*,使用PyUnicode_FromString转换为python unicode instrance应该非常简单.我有一种感觉,这是微不足道的,但我似乎无法弄清楚如何.

根据Ignacio Vazquez-Abrams和Thomas KI的评论,确实让这个单线工作; 对于这种情况,您可以绕过所有boost.python基础结构.这是一个例子:

        PyObject* PyMyFunc() {
            const char* txt =  BaseClass::MyFunc();
            return PyUnicode_FromString(txt); 
    }       
Run Code Online (Sandbox Code Playgroud)

暴露在通常的def语句中:

class_<MyCclass>("MyClass")
    .def("MyFunc", &MyClass::PyMyFunc);
Run Code Online (Sandbox Code Playgroud)

不幸的是,当您想要返回unicode实例列表时,这不起作用.这是我天真的实现:

boost::python::list PyMyFunc() {
    std::vector<std::string> raw_strings = BaseClass::MyFunc();
    std::vector<std::string>::const_iterator i;
    boost::python::list result;

    for (i=raw_strings.begin(); i!=raw_strings.end(); i++)
        result.append(PyUnicode_FromString(i->c_str()));
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但这不编译:boost :: python :: list似乎处理PyObject值.

c++ python boost boost-python

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