f13846b133
* Start moving out URI from ConnectionContext Create connections with an initial context. Database will set itself as context after connection has been created * Migrate to simpler/decoupled factory in driver This allows more freedom on how the connection is created. It will no longer need to have an explicit reference to the connection URI * Introduce DB::Connection::Options Move prepared_statements out from ConnectionContext * Delegate options parsing to driver DRY parsing connection options for database * Introduce DB::Pool::Options * Rename Driver#connection_pool_options to pool_options * Drop driver getter from database * Drop uri getter from database * Add public Database#initialize method * Drop :nodoc: Database#initialize * Pass spec helper explicitly (to access methods within each spec) * Update docs * Update src/db/pool.cr Co-authored-by: Beta Ziliani <beta@manas.tech> * Use ConnectionBuilder instead of procs * Fix inferred type when there is a single concrete connection type * Update src/db/driver.cr Co-authored-by: Beta Ziliani <beta@manas.tech> --------- Co-authored-by: Beta Ziliani <beta@manas.tech> |
||
---|---|---|
.github/workflows | ||
spec | ||
src | ||
.gitignore | ||
CHANGELOG.md | ||
LICENSE | ||
README.md | ||
shard.yml |
crystal-db
Common db api for crystal. You will need to have a specific driver to access a database.
Installation
If you are creating a shard that will work with any driver, then add crystal-db
as a dependency in shard.yml
:
dependencies:
db:
github: crystal-lang/crystal-db
If you are creating an application that will work with some specific driver(s), then add them in shard.yml
:
dependencies:
sqlite3:
github: crystal-lang/crystal-sqlite3
crystal-db
itself will be a nested dependency if drivers are included.
Note: Multiple drivers can be included in the same application.
Documentation
Usage
This shard only provides an abstract database API. In order to use it, a specific driver for the intended database has to be required as well:
The following example uses SQLite where ?
indicates the arguments. If PostgreSQL is used $1
, $2
, etc. should be used. crystal-db
does not interpret the statements.
require "db"
require "sqlite3"
DB.open "sqlite3:./file.db" do |db|
# When using the pg driver, use $1, $2, etc. instead of ?
db.exec "create table contacts (name text, age integer)"
db.exec "insert into contacts values (?, ?)", "John Doe", 30
args = [] of DB::Any
args << "Sarah"
args << 33
db.exec "insert into contacts values (?, ?)", args: args
puts "max age:"
puts db.scalar "select max(age) from contacts" # => 33
puts "contacts:"
db.query "select name, age from contacts order by age desc" do |rs|
puts "#{rs.column_name(0)} (#{rs.column_name(1)})"
# => name (age)
rs.each do
puts "#{rs.read(String)} (#{rs.read(Int32)})"
# => Sarah (33)
# => John Doe (30)
end
end
end
Roadmap
Issues not yet addressed:
- Support non prepared statements. #25
- Time data type. (implementation details depends on actual drivers)
- Data type extensibility. Allow each driver to extend the data types allowed.
- Transactions & nested transactions. #27
- Connection pool.
- Logging
- Direct access to
IO
to avoid memory allocation for blobs.
Contributing
- Fork it ( https://github.com/crystal-lang/crystal-db/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- bcardiff Brian J. Cardiff - creator, maintainer