标签: hdbc

最便宜的方法来确定MySQL连接是否仍然存在

我有一个基于Web的数据服务的MySQL连接池.当它开始为请求提供服务时,它需要从池中连接才能使用.问题是如果自从使用该特定连接以来已经存在显着的暂停,则服务器可能已经将其计时并且关闭其结束.我希望能够在池管理代码中检测到这一点.

诀窍是:我编码的环境只给我一个非常抽象的API连接.我基本上只能执行SQL语句.我无权访问实际的套接字或直接访问MySQL客户端API.

所以,问题是:我可以在连接上执行哪个最便宜的MySQL语句,以确定它是否正常工作.比如SELECT 1;应该工作,但我想知道是否有更便宜的东西?也许某些东西甚至没有通过网络,但在MySQL客户端库中处理并有效地回答相同的问题?

澄清:我不关心检查MySQL服务器是否正在运行,或者它的数据库配置是否足以回答查询.如果这些事情发生故障,那么服务执行的后续SQL将获取并处理相应的错误.我真的只关心TCP连接是否打开...因为如果服务器关闭它,那么Web服务的SQL将收到一个错误,意味着"只需重新连接并再试一次",这样就不方便了.服务代码的渣土.

关闭:/* ping */黑客正是那种我一直在寻找的东西,但可惜只能通过JDBC.通过文档阅读该hack,很明显它被放在那里的原因与我想要的完全相同.对于好奇,我在Haskel工作,使用HDBCHDBC-mysql.我将要求HDBC-mysql的作者添加一种mysql_ping()直接或通过类似黑客调用的方法.

Vlad's DO 1也是我追求的那种东西,而且由于另一个hack在JDBC之外是不可用的,我将使用它.

感谢所有精彩的讨论,特别是@Vlad!

mysql libmysql hdbc

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

Haskell是否有像ActiveRecord或Sequel这样的SQL查询编写库?

随着Ruby的ActiveRecord的或续集,你可以逐步建立SQL查询,添加wherejoinorder条款,这取决于在运行时条件的查询.

这是一个简单的例子,取自ASCIIcasts:

def index  
  @articles = Article.order('name')  

  if params[:hidden]  
    @articles = @articles.where(:hidden =>(params[:hidden] == "1"))  
  end  

  respond_to do |format|  
    format.html # index.html.erb  
    format.xml  { render :xml => @articles }  
  end  
end
Run Code Online (Sandbox Code Playgroud)

该示例显示了articles如果HTTP请求查询参数名为hiddenequals,WHERE子句如何附加到表上的基础SQL查询1.

我一直在Haskell中看HDBC和postgresql-simple.似乎postgresql-simple故意使得从动态连接的部分构建SQL查询变得困难,以防止SQL注入.HDBC似乎足够灵活,可以根据运行时的条件构建不同结构的SQL查询,但它似乎没有提供ActiveRecord或Sequel提供的抽象级别.

任何人都可以建议使用其中一个Haskell数据库模拟ActiveRecord的动态查询构建工具吗?

如果HDBC是要走的路,我很好.但是可以理解插图.

我想我正在寻找的是能够针对PostgreSQL后端动态组合查询.

haskell hdbc

13
推荐指数
2
解决办法
3219
查看次数

Haskell中的并发数据库连接池

我是一名学习Haskell的Java程序员.
我在一个小型网络应用程序上工作,该应用程序使用Happstack并通过HDBC与数据库进行通信.

我编写了selectexec函数,我就像这样使用它们:

module Main where

import Control.Exception (throw)

import Database.HDBC
import Database.HDBC.Sqlite3 -- just for this example, I use MySQL in production

main = do
    exec "CREATE TABLE IF NOT EXISTS users (name VARCHAR(80) NOT NULL)" []

    exec "INSERT INTO users VALUES ('John')" []
    exec "INSERT INTO users VALUES ('Rick')" []

    rows <- select "SELECT name FROM users" []

    let toS x = (fromSql x)::String
    let names = map (toS . head) rows

    print names …
Run Code Online (Sandbox Code Playgroud)

rdbms haskell connection-pooling hdbc

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

Sqlite外键

我尝试使用HDBC-sqlite3 haskell库启用外键.这个库使用了一个小辅助c函数

int sqlite3_open2(const char *filename, finalizeonce **ppo)
Run Code Online (Sandbox Code Playgroud)

它依次调用sqlite3_open.在sqlite文档中,我发现了一个很好的sqlite3_db_config函数,可以启用外键.为了测试它,我已经快速添加了2行sqlite3_open2(最后两个列表):

int sqlite3_open2(const char *filename, finalizeonce **ppo) {
  sqlite3 *ppDb;
  finalizeonce *newobj;
  int res, *resFK, resFK1;

  fprintf(stderr, "DB pointer: %d\n", ppDb);

  res = sqlite3_open(filename, &ppDb);

  resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);                    
  fprintf(stderr, "\nForeign Keys: ON/OFF:%d  ERR:%d\n", resFK, resFK1);  

  ...
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是结果:Foreign Keys: ON/OFF:0 ERR:1.

有人能给我一个暗示我做错了什么或者什么是启用外键的正确方法?

c sqlite haskell hdbc

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

转换在mysql中使用的时间

我正在尝试将时间戳加载到mysql中.我所有的时间都是UTCTime对象.HDBC mysql实现似乎不喜欢UTCTime对象,尽管内部文档说它将所有时间都视为UTC时间.我相信我需要将UTCTime转换为EpochTime,因为它看起来像HDBC mysql实现支持绑定SqlEpochTime.我无法弄清楚如何获取我的UTCTime并从中获取EpochTime.

mysql haskell hdbc

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

Haskell算术运算和任意/固定精度数的DB持久性

作为Haskell(GHC平台)的初学者,我遇到了处理与业务领域相关的数据类型和算术运算的问题,涉及货币/货币操作,我正在寻找解决方案.

我正在开发应该与(独立)会计模块(通过Web服务)接口的应用程序,同时具有用于临时数据输入的(web)用户界面,该用户界面存储在单独的数据库(PostgreSQL)中.

我来自C#/ F#环境,System.Decimal涵盖了那里的所有核心需求.如果我错了,请纠正我,但Haskell似乎没有可被视为等效的集成(默认)数据类型.

理想的选择是提供任意精度算术的数据类型,或者至少是Decimal128(IEEE 754)中的某些内容.该类型应该支持舍入(最接近,从零开始,如果可能还与偶数相关)和以下操作:加,减,乘,除(理想情况下也是平方/根).还应支持类型之间的转换.

从我设法发现,Hackage上有两个Haskell模块应该完全执行计算--Data.Fixed和Data.Decimal(顺便说一句,有什么方法可以在Haskell中创建自定义文字 - 例如复制123.45m来自F#?).至少后者会尽我所知(在快速测试之后)启用我在前一段中描述的大部分内容,但是当我添加一个DB(PostgreSQL通过Persistent/HDBC)和一个Web框架(YESOD)时混合的东西看起来不那么好看.似乎缺乏支持.

是否有任何其他组合能够以最小的摩擦力实现我所描述的端到端(数据输入=>数据处理=>存储)(例如,从DB加载后从字符串手动转换似乎很奇怪,具有非常强类型的语言)没有精度的损失(任何指针欢迎)?

haskell persistent yesod hdbc

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

HDBC ODBC MySQL - 查询仅在编译时失败

我的程序使用runghc运行,但编译时出现错误"在查询期间丢失与MySQL服务器的连接"时,同一程序始终失败.失败与长时间运行的查询无关(它是小表上的CREATE VIEW).MySQL错误日志中没有任何内容,log_warnings = 1.环境 - ubuntu(13.04 ;-),本地数据库)

mysql odbc haskell hdbc

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

如何通过HDBC将二进制数据放入postgres?

我有一个Haskell应用程序,作为许多步骤之一,需要在数据库中存储和检索原始二进制blob数据.我并不是完全决定将这些数据存储在普通磁盘文件中,但这确实会导致额外的一系列权限问题,因此我现在想要使用数据库.

我创建了一个包含类型列的表bytea.

我在内存中有一个Lazy Bytestring.

当我这样打电话的时候

run conn "INSERT INTO documents VALUES (?)" [toSql $ rawData mydoc]
Run Code Online (Sandbox Code Playgroud)

postgres对数据有点生气.确切的错误消息是

invalid byte sequence for encoding \"UTF8\": 0xcf72
Run Code Online (Sandbox Code Playgroud)

我也毫无疑问地知道我在数据流中有NUL值.因此,考虑到所有这些,安全地编码数据以进行插入的正确方法是什么?


更新

这是我的表的描述

db=> \d+ documents
                          Table "public.documents"
     Column      |            Type             | Modifiers | Storage  | Description 
-----------------+-----------------------------+-----------+----------+-------------
 id              | character varying(16)       | not null  | extended | 
 importtime      | timestamp without time zone | not null  | plain    | 
 filename        | character varying(255)      | not null  | extended | 
 data            | bytea                       | …
Run Code Online (Sandbox Code Playgroud)

postgresql haskell hdbc

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

生成的SQL查询不会返回与sqlite3 HDBC中相应的静态查询相同的内容

我在Haskell中生成SQL查询并使用HDBC将它们提交到SQLite(3)数据库.现在,此函数返回一个查询:

import Database.HDBC.Sqlite3 
import Database.HDBC
data UmeQuery = UmeQuery String [SqlValue] deriving Show

tRunUmeQuery :: UmeQuery -> FilePath -> IO [[SqlValue]]
tRunUmeQuery (UmeQuery q args) dbFile = do
    conn <- connectSqlite3 dbFile
    stat <- prepare conn q
    s <- execute stat args
    res <- fetchAllRows' stat 
    disconnect conn
    return $ res

selectPos targetlt parentlt op pos = let 
    q= "select TARGET.* from levels tl, labeltypes tlt, segments TARGET, 
    (select TARGET.session_id session_id,SECONDARY.labeltype_id labeltype_id, 
    SECONDARY.label_id label_id,min(TARGET.label_id) min_childlabel_id from 
    levels tl, labeltypes tlt, …
Run Code Online (Sandbox Code Playgroud)

sql sqlite haskell generated-code hdbc

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

HDBC -odbc与haskell连接

现在我想连接db与haskell,我尝试使用cabal安装HDBC-ODBC,HSQL-ODBC和HDBC-mysql,我能够配置sqlite3,我怎么能添加这些包?当我尝试使用cabal安装它时,我收到此错误

Resolving dependencies...
Configuring HDBC-odbc-2.2.3.2...
Preprocessing library HDBC-odbc-2.2.3.2...
Connection.hsc:47:17: error: sql.h: No such file or directory
Connection.hsc:48:20: error: sqlext.h: No such file or directory
Connection.hsc: In function ‘main’:
Connection.hsc:95: error: ‘SQL_HANDLE_ENV’ undeclared (first use in this function)
...........................................
.........................................
Connection.hsc:245: error: expected expression before ‘int’
Connection.hsc:245: error: expected ‘)’ before numeric constant
Connection.hsc:245: error: expected ‘)’ before numeric constant
compiling dist/build/Database/HDBC/ODBC/Connection_hsc_make.c failed
command was: /usr/bin/gcc -c -D__GLASGOW_HASKELL__=612 -I. -I/usr/lib/ghc-6.12.1/time-1.1.4/include -I/usr/lib/ghc-6.12.1/old-time-1.0.0.3/include -I/usr/lib/ghc-6.12.1/bytestring-0.9.1.5/include -I/usr/lib/ghc-6.12.1/base-4.2.0.0/include -I/usr/lib/ghc-6.12.1/include -I/usr/lib/ghc-6.12.1/include -I/usr/lib/ghc-6.12.1/include/ dist/build/Database/HDBC/ODBC/Connection_hsc_make.c -o dist/build/Database/HDBC/ODBC/Connection_hsc_make.o
cabal: Error: …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-platform hdbc

3
推荐指数
1
解决办法
1109
查看次数

Haskell HDBC在F#中的优雅?

我对Haskell的简洁和优雅感到震惊.但是我在一个.Net的房子里工作,所以当我能够逃脱它时,我会使用F# - 我可能是全国数百名使用它的人中唯一一个.

ADO.NET或F#是否提供与HDBC一样简洁优雅的东西executeMany?我正在通过真实世界Haskell.在第21章中,它提供了这个例子:

ghci> conn <- connectSqlite3 "test1.db"
ghci> stmt <- prepare conn "INSERT INTO test VALUES (?, ?)"
ghci> executeMany stmt [[toSql 5, toSql "five's nice"], [toSql 6, SqlNull]]
ghci> commit conn
ghci> disconnect conn
Run Code Online (Sandbox Code Playgroud)

我想在我的F#中获得这种优雅和简洁.我已经看到很多关于使用参数化查询以避免SQL注入攻击的炒作.在这种情况下,我没有使用它们有三个原因:

  1. 我发现.Net中的参数化查询很丑陋且繁琐.
  2. 我的数据来自公司办公室,因此它(大部分)都是干净的.
  3. 我的表有34列.我鄙视用34列参数化查询的想法.

这是我的F#代码:

module Data

open System
open System.Data
open System.Data.OleDb
open System.Text.RegularExpressions

type Period = Prior | Current

let Import period records db =
    use conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + db + ";Persist …
Run Code Online (Sandbox Code Playgroud)

ado.net f# haskell hdbc

3
推荐指数
1
解决办法
497
查看次数

如何在Happstack中使用"IO String"作为HTTP响应?

我正在使用HDBC从数据库中检索数据,然后尝试使用Happstack将此数据发送到Web客户端.

myFunc :: Integer -> IO String
myFunc = ... fetch from db here ...

handlers :: ServerPart Response
handlers =
    do decodeBody (defaultBodyPolicy "/tmp/" 0 1000 1000)
       msum [ 
                dir "getData" $ ok $ toResponse $ myFunc $ toInteger 1
            ]

mainFunc = simpleHTTP nullConf handlers
Run Code Online (Sandbox Code Playgroud)

当我构建上面的代码时,我收到此错误:

使用"toResponse"时没有(ToMessage(IO String))的实例

我尝试了什么?

  1. 我试图将其转换IO StringString(liftIO例如使用).
  2. 我试图在这里找到任何类似的问题.
  3. 我试图在Happstack Crash Course中找到一个类似的例子.
  4. 我用各种不同的组合搜索了所有相关的关键字.

提前致谢.

haskell happstack hdbc

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