Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions .github/workflows/check-standard.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:
R_KEEP_PKG_SOURCE: yes

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4

- uses: r-lib/actions/setup-pandoc@v2

Expand All @@ -41,9 +41,7 @@ jobs:

- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: |
any::rcmdcheck
RConsortium/OOP-WG
extra-packages: any::rcmdcheck
needs: check

- uses: r-lib/actions/check-r-package@v2
Expand Down
41 changes: 28 additions & 13 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,25 +1,40 @@
Package: sqlr
Title: Build SQL queries for creating/altering tables
Version: 0.0.1.9000
Title: Represent and Generate SQL Schemas
Version: 0.0.0.9000
Authors@R: c(
person("Nicolas", "Bennett", email = "r@nbenn.ch", role = c("aut", "cre")))
Description:
Starting with MardaDB/MySQL and possibly expanding to other SQL dialects, the aim of this package is to help with generating queries for creating and altering tables.
A dialect-independent representation of a relational schema -- tables,
columns, types, constraints and indexes -- that can be built up from R,
rendered as data definition language for a given SQL dialect, and learned
back from a live database. Dialect support is provided by companion
packages.
Depends:
R (>= 3.6.0),
R7 (>= 0.0.0.9000)
R (>= 4.1)
Imports:
DBI,
methods
S7,
utils
Suggests:
testthat (>= 3.0.0),
RPostgres
testthat (>= 3.0.0)
URL: https://github.com/nbenn/sqlr
BugReports: https://github.com/nbenn/sqlr/issues
License: MIT + file LICENSE
Encoding: UTF-8
LazyData: true
RoxygenNote: 7.2.1
Remotes:
RConsortium/OOP-WG
Config/testthat/edition: 3
Config/roxygen2/version: 8.1.0
Collate:
'sqlr-package.R'
'class_sql.R'
'class_type.R'
'type_shorthand.R'
'class_column.R'
'class_constraint.R'
'class_index.R'
'class_table.R'
'class_schema.R'
'class_dialect.R'
'generics.R'
'registry.R'
'order.R'
'render.R'
'compare.R'
64 changes: 56 additions & 8 deletions NAMESPACE
Original file line number Diff line number Diff line change
@@ -1,10 +1,58 @@
# Generated by roxygen2: do not edit by hand

export()
export(int)
export(parse_sql)
export(render_sql)
export(simulate_postgres)
export(smallint)
import(R7)
importFrom(DBI,SQL)
export(as_sqlr_type)
export(sqlr_bigint)
export(sqlr_binary_type)
export(sqlr_blob)
export(sqlr_boolean)
export(sqlr_boolean_type)
export(sqlr_catalog)
export(sqlr_char)
export(sqlr_check)
export(sqlr_column)
export(sqlr_constraint)
export(sqlr_date)
export(sqlr_decimal_type)
export(sqlr_defers_constraints)
export(sqlr_dialect)
export(sqlr_diff)
export(sqlr_double)
export(sqlr_equal)
export(sqlr_float_type)
export(sqlr_for)
export(sqlr_foreign_key)
export(sqlr_identity)
export(sqlr_index)
export(sqlr_index_spec)
export(sqlr_int)
export(sqlr_integer_type)
export(sqlr_json)
export(sqlr_json_type)
export(sqlr_numeric)
export(sqlr_other)
export(sqlr_other_type)
export(sqlr_parse_type)
export(sqlr_primary_key)
export(sqlr_quote)
export(sqlr_quote_literal)
export(sqlr_real)
export(sqlr_reflect)
export(sqlr_reflect_schema)
export(sqlr_register_dialect)
export(sqlr_render)
export(sqlr_render_type)
export(sqlr_schema)
export(sqlr_smallint)
export(sqlr_sql)
export(sqlr_string_type)
export(sqlr_table)
export(sqlr_text)
export(sqlr_time)
export(sqlr_time_type)
export(sqlr_timestamp)
export(sqlr_type)
export(sqlr_unique)
export(sqlr_uuid)
export(sqlr_uuid_type)
export(sqlr_varchar)
import(S7)
83 changes: 83 additions & 0 deletions R/class_column.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
#' Table columns
#'
#' A column of a [sqlr_table()]. `identity` describes an automatically
#' generated key; it is what a dialect maps its `SERIAL`-style spellings onto.
#'
#' @param name Column name.
#' @param type A [sqlr_type], or a string parsed by [as_sqlr_type()].
#' @param null Whether the column admits `NULL`. A column named in a primary
#' key is forced to `FALSE`, matching what every engine reports back.
#' @param default Default value: a length-one atomic, a [sqlr_sql()]
#' expression, or `NULL` for none.
#' @param description Comment attached to the column.
#' @param identity An [sqlr_identity()], or `NULL`.
#' @param attrs Named list of dialect-specific attributes, ignored by dialects
#' that do not recognise them.
#' @param generated Whether the identity always applies, or yields to a
#' supplied value.
#' @param start,increment Sequence start and step.
#'
#' @return A `sqlr_column` or `sqlr_identity` object.
#'
#' @examples
#' sqlr_column("email", "varchar(255)", null = FALSE)
#' sqlr_column("id", sqlr_bigint(), identity = sqlr_identity())
#'
#' @export
sqlr_identity <- new_class(
"sqlr_identity",
properties = list(
generated = new_property(class_character, default = "by default"),
start = new_property(class_integer, default = 1L),
increment = new_property(class_integer, default = 1L)
),
validator = function(self) {
if (!self@generated %in% c("always", "by default")) {
"`generated` must be \"always\" or \"by default\""
}
}
)

#' @rdname sqlr_identity
#' @export
sqlr_column <- new_class(
"sqlr_column",
properties = list(
name = class_character,
type = sqlr_type,
null = new_property(class_logical, default = TRUE),
default = new_property(class_any, default = NULL),
description = new_property(class_character, default = NA_character_),
identity = new_property(new_union(NULL, sqlr_identity), default = NULL),
attrs = new_property(class_list, default = quote(list()))
),
constructor = function(name, type, null = TRUE, default = NULL,
description = NA_character_, identity = NULL,
attrs = list()) {
new_object(
S7_object(),
name = name,
type = as_sqlr_type(type),
null = null,
default = default,
description = description,
identity = identity,
attrs = attrs
)
},
validator = function(self) {
if (length(self@name) != 1L || is.na(self@name)) {
return("`name` must be a string")
}
if (length(self@null) != 1L || is.na(self@null)) {
return("`null` must be TRUE or FALSE")
}
if (!valid_default(self@default)) {
"`default` must be NULL, a length-one atomic, or a sqlr_sql()"
}
}
)

valid_default <- function(x) {
is.null(x) || S7_inherits(x, sqlr_sql) || (is.atomic(x) && length(x) == 1L)
}
16 changes: 0 additions & 16 deletions R/class_con.R

This file was deleted.

Loading
Loading