GithubHelp home page GithubHelp logo

mysql2-cs-bind's Introduction

mysql2-cs-bind

'mysql2-cs-bind' is extension of 'mysql2', to add method of client-side variable binding (pseudo prepared statement).

Installation

Add this line to your application's Gemfile:

gem 'mysql2-cs-bind'

And then execute:

$ bundle

Or install it yourself as:

$ gem install mysql2-cs-bind

Usage

Require 'mysql2-cs-bind' instead of (or after) 'mysql2', you can use Mysql2::Client#xquery with bound variables like below:

require 'mysql2-cs-bind'
client = Mysql2::Client.new(...)
client.xquery('SELECT x,y,z FROM tbl WHERE x=? AND y=?', val1, val2) #=> Mysql2::Result

Mysql2::Client#xquery receives query, variables, and options(hash) for Mysql2::Client#query.

client.xquery(sql)
client.xquery(sql, :as => :array)
client.xquery(sql, val1, val2)
client.xquery(sql, [val1, val2])
client.xquery(sql, val1, val2, :as => :array)
client.xquery(sql, [val1, val2], :as => :array)

Mysql2::Client#xquery raises ArgumentError if mismatch found between placeholder number and arguments

client.xquery('SELECT x FROM tbl', 1)                   # ArgumentError
client.xquery('SELECT x FROM tbl WHERE x=? AND y=?', 1) # ArgumentError
client.xquery('SELECT x FROM tbl WHERE x=?', 1, 2)      # ArgumentError

Formatting for nil and Time objects:

client.xquery('INSERT INTO tbl (val1,created_at) VALUES (?,?)', nil, Time.now)
#execute "INSERT INTO tbl (val1,created_at) VALUES (NULL,'2012-01-02 13:45:01')"

Expanding for Array object.

client.xquery('SELECT val1 FROM tbl WHERE id IN (?)', [[1,2,3]])
#execute "SELECT val1 FROM tbl WHERE id IN ('1','2','3')"

Type Conversion of Numbers

Mysql2::Client#xquery quotes any values as STRING. This may not be problems for almost all kind of queries, but sometimes you may be confused by return value types:

client.query('SELECT 1', :as => :array).first #=> [1]
client.xquery('SELECT ?', 1, :as => :array).first #=> ['1']

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Copyright

Copyright (c) 2012- TAGOMORI Satoshi (tagomoris)

License

MIT (see MIT-LICENSE)

mysql2-cs-bind's People

Contributors

tagomoris avatar kamipo avatar mitoma avatar ryopeko avatar sonots avatar

Stargazers

Masato Sugiyama avatar Naoto Enokawa avatar machida avatar Kosuke Adachi avatar mactkg avatar Shuichi Tamayose avatar Morton Fox avatar Seiya IZUMI avatar keisei_1092 avatar Yuki Kurihara avatar JINNOUCHI Yasushi avatar Masaya Aoyama (@amsy810) avatar Nao Minami avatar Akira Kusumoto avatar ITO Shogo avatar Keiji Matsuzaki avatar Kikuko Toda avatar  avatar ohshhh avatar Uchiko avatar kitanp avatar Yosuke Ishikawa avatar Kazuma Furuhashi avatar  avatar Sorah Fukumori avatar ramtiga avatar  avatar Hiroshi IKEGAMI avatar y_matsuwitter avatar  avatar Atsuo Fukaya avatar Ryutaro Miyashita avatar  avatar Shusuke Mikami avatar  avatar Masao S avatar Keiji, Yoshimi avatar Norio Shimizu avatar

Watchers

 avatar  avatar  avatar James Cloos avatar  avatar  avatar

mysql2-cs-bind's Issues

Argument true/false does not work

With a table as:

CREATE TABLE IF NOT EXISTS tests (
    bool BOOLEAN NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Following xquery

db.xquery('INSERT INTO tests (bool) VALUES (?)', true)

raises an error as:

lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:131:in `_query': Incorrect integer value: 'true' for column 'bool' at row 1 (Mysql2::Error)
        from lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:131:in `block in query'
        from lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:130:in `handle_interrupt'
        from lib/ruby/gems/2.4.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:130:in `query'
        from lib/ruby/gems/2.4.0/gems/mysql2-cs-bind-0.0.6/lib/mysql2-cs-bind.rb:14:in `xquery'

because it executes

INSERT INTO tests (bool) VALUES ('true')

Note that

INSERT INTO tests (bool) VALUES (true)

or

INSERT INTO tests (bool) VALUES ('1')

works

Extra set of ' ' added on top of original ones

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' ' [xquery parameter] ' ' at line 1 (Mysql2::Error)

Fixed by deleting the appended ' ' in front and after the parameters.
Took my 6 hours to try to get a prepared statement going and then I just decided to try to fix your gem instead. That took 10 seconds. Programmer lyf :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.