Sql

Postgresql 9.0以上 数据库接口。 全部展开

连接展开

  • + connected = sql:connected()

    尝试完成延迟连接,返回是否已完成连接。

  • + sql, options = _sql('ip或域名:port', username, password, timeoutSeconds, options, connectingTimeoutSeconds)

    连接postgresql数据库。

    • 参数
    • username : 用户名,数据库默认与用户名相同。
    • password : 密码,可以为空串,只支持md5验证。
    • timeoutSeconds : 等待连接和所有数据库操作的超时秒数,1~86400,超时将关闭连接,抛出错误。
    • options : 可以通过table类型的options参数指定连接选项,key为选项名,value为选项值,都必须为字符串。例如{database='name'},可用选项请参考 http://www.postgresql.org/docs/9.0/static/index.html 。
    • connectingTimeoutSeconds : 延迟连接超时秒数,非nil则立即返回,连接可能未完成,由后续sql:connected、sql:runs和sql:run方法尝试完成连接。
    • 返回
    • 返回的sql对象为table类型,可以自行增加内容或包装函数。
    • 返回table类型的options,表示数据库端的连接选项,key为选项名,value为选项值,都为字符串。

执行展开

  • + result = sql:run(statement,param...)

    执行一条sql命令,可指定多个参数。
    如果是查询语句,没有查询结果,则返回nil或空table(参见{sql:emptys}),否则返回行集table或者列集table(参见{sql:columns})。
    如果是操作语句,返回操作影响的行数。
    超时将关闭连接,抛出错误。
    如果数据库返回了错误,也将抛出,但不关闭连接。

  • + sql:runbuffer(column, buffers)

    执行一条sql命令前,可指定缓冲区,减少内存分配次数。
    column为该缓冲区buffers支持的结果集列数。 每次run之前都需要执行runbuffer,run后自动将使用的buffer从buffers中删除。

        if not _G.buffers then
            print('set runbuffer')
            _G.buffers = sql:run('SELECT * FROM usertable')
        end

        sql:runbuffer(6, _G.buffers)
        sql:run('SELECT * FROM usertable')
  • + sql:runs(statements)

    批量执行sql命令,可用 ; 分隔,无参数,忽略执行结果。
    超时将关闭连接,抛出错误。
    如果数据库返回了错误,也将抛出,但不关闭连接。

模式展开

  • + sql = sql:columns()

    下一个sql:run调用返回列集,之后恢复行集。
    sql:run默认返回行集数组,按数据库返回顺序,下标递增,每个行本身也是table,以列名为key,列值为value。
    类似: {[1]={id=1, name='a'}, [2]={id=2, name='b'} },通常适合将每行数据当作结构或对象处理。
    而返回列集table时,以列名为key,value为列值数组,按数据库返回顺序,下标递增,每个行的对应列值作为内容。
    类似: {['id']={[1]=1, [2]=2}, ['name']={[1]='a', [2]='b'} },通常适合返回的列少,而行数很大。
    返回sql便于串联调用。

  • + sql = sql:default(cleanPrepare)

    恢复各种模式为默认值。
    cleanPrepare :非false非nil,则同时清除所有prepared statement分析结果。
    返回sql便于串联调用。

  • + sql = sql:emptys()

    下一个sql:run调用返回空table,之后恢复nil。
    如果查询语句没有查询结果,既行数为0,默认sql:run返回nil。
    空table且没有查询结果时,如果是行集,即为空数组,如果是列集,则列名为key,而value是空数组。
    返回sql便于串联调用。

  • + sql = sql:exclude(columnName...)

    下一个sql:run调用忽略若干列,之后恢复全部列。
    sql:run查询语句的所有列默认全部返回。
    exclude列名,如果是行集,则每个行table没有这个列名和列值,如果是列集,则没有这个列名和列值数组。
    返回sql便于串联调用。

  • + sql = sql:parse()

    下一个sql:run调用解析sql语句,而不使用prepared statement。
    默认sql:run会将每个语句按照prepared statement发送给数据库,并记住对应的参数类型,下次调用省去语句和参数类型分析。
    解析语句则不使用prepared statement,每次调用都要做语句和参数分析。
    每个语句的第一次执行总是会解析语句。
    返回sql便于串联调用。

  • + sql = sql:skip()

    下一个sql:runs和sql:run调用跳过结果,不等待数据库返回。
    发送请求给数据库后,sql:runs和sql:run就返回,无返回值。
    数据库处理完请求后仍然会发回结果,但被跳过。
    非跳过结果的sql:runs和sql:run首先等待之前所有跳过结果的请求执行完毕,才发送请求。
    解析语句(包括每个语句的第一次执行)都会等待数据库处理,不会跳过结果。
    返回sql便于串联调用。
    数据库返回的结果留在缓冲区里,后面的同步或异步命令执行时会读出来,非错的丢掉 有错的直接抛错给lua,执行同步命令时处理之前所有异步命令的结果,执行异步命令时处理已经收到的所有结果。

关闭展开

  • + closed = sql:closed()

    返回数据库连接是否关闭。

  • + sql:close()

    关闭数据库连接。

类型展开

  • +

    支持的postgresql数据类型,及对应的lua转换

    Postgresql类型Lua类型
    boolboolean
    int2整数 -215 ~ 215-1
    int4整数 -231 ~ 231-1
    int8整数 -253 ~ 253-1
    float4浮点数
    float8浮点数
    timestamp整数 距离2000-1-1的微秒数
    inet、cidr整数 0~232-1(仅限ipv4)
    char字符串、字节串(仅限参数传入)、浮点数
    char()字符串、字节串(仅限参数传入)、浮点数
    varchar 字符串、字节串(仅限参数传入)、浮点数
    text字符串、字节串(仅限参数传入)、浮点数
    bytea字符串(仅限参数传入)、字节串、浮点数
    bool[1:n]数组,nil或boolean元素
    int2[1:n]数组,nil或整数元素 -215 ~ 215-1
    int4[1:n]数组,nil或整数元素 -231 ~ 231-1
    int8[1:n]数组,nil或整数元素 -253 ~ 253-1
    float4[1:n]数组,nil或浮点数元素
    float8[1:n]数组,nil或浮点数元素
    timestamp[1:n]数组,nil或整数元素 距离2000-1-1的微秒数
    inet[1:n]、cidr[1:n]数组,nil或整数元素 0~232-1(仅限ipv4)
    char[1:n]数组,nil或字符串、字节串(仅限参数传入)、浮点数元素
    char()[1:n]数组,nil或字符串、字节串(仅限参数传入)、浮点数元素
    varchar[1:n]数组,nil或字符串、字节串(仅限参数传入)、浮点数元素
    text[1:n]数组,nil或字符串、字节串(仅限参数传入)、浮点数元素
    bytea[1:n]数组,nil或字符串(仅限参数传入)、字节串、浮点数元素

Postgresql参考内存配置展开

  • +

    假设系统内存8G,大约4G留给数据库使用,数据库连接较少。
    max_connections = 10
    synchronous_commit = off
    shared_buffers = 1024MB
    work_mem = 64MB
    maintenance_work_mem = 256MB
    effective_cache_size = 2048MB
    checkpoint_segments = 4
    checkpoint_timeout = 60
    checkpoint_completion_target = 0.4

问题反馈(登录才可以发表哦!)