Package Usage: go: github.com/square/squalor
Package squalor provides SQL utility routines, such as validation of
models against table schemas, marshalling and unmarshalling of model
structs into table rows and programmatic construction of SQL
statements.
While squalor uses the database/sql package, the SQL it utilizes is
MySQL specific (e.g. REPLACE, INSERT ON DUPLICATE KEY UPDATE, etc).
Given a simple table definition:
And a model for a row of the table:
The BindModel method will validate that the model and the table
definition are compatible. For example, it would be an error for the
User.ID field to have the type string.
The table definition is loaded from the database allowing custom
checks such as verifying the existence of indexes.
While fields are often primitive types such as int64 or string, it is
sometimes desirable to use a custom type. This can be accomplished by
having the type implement the sql.Scanner and driver.Valuer
interfaces. For example, you might create a GzippedText type which
automatically compresses the value when it is written to the database
and uncompressed when it is read:
The Insert method is used to insert one or more rows in a table.
You can pass either a struct or a pointer to a struct.
Multiple rows can be inserted at once. Doing so offers convenience and
performance.
When multiple rows are batch inserted the returned error corresponds
to the first SQL error encountered which may make it impossible to
determine which row caused the error. If the rows correspond to
different tables the order of insertion into the tables is
undefined. If you care about the order of insertion into multiple
tables and determining which row is causing an insertion error,
structure your calls to Insert appropriately (i.e. insert into a
single table or insert a single row).
After a successful insert on a table with an auto increment primary
key, the auto increment will be set back in the corresponding field of
the object. For example, if the user table was defined as:
Then we could create a new user by doing:
The Replace method replaces a row in table, either inserting the row
if it doesn't exist, or deleting and then inserting the row. See the
MySQL docs for the difference between REPLACE, UPDATE and INSERT ON
DUPLICATE KEY UPDATE (Upsert).
The Update method updates a row in a table, returning the number of
rows modified.
The Upsert method inserts or updates a row.
The Get method retrieves a single row by primary key and binds the
result columns to a struct.
The delete method deletes rows by primary key.
See the documentation for DB.Delete for performance limitations when
batch deleting multiple rows from a table with a primary key composed
of multiple columns.
To support optimistic locking with a column storing the version number,
one field in a model object can be marked to serve as the lock. Modifying
the example above:
Now, the Update method will ensure that the object has not been concurrently
modified when writing, by constraining the update by the version number.
If the update is successful, the version number will be both incremented
on the model (in-memory), as well as in the database.
Programmatic construction of SQL queries prohibits SQL injection
attacks while keeping query construction both readable and similar to
SQL itself. Support is provided for most of the SQL DML (data
manipulation language), though the constructed queries are targetted
to MySQL.
DB provides wrappers for the sql.Query and sql.QueryRow
interfaces. The Rows struct returned from Query has an additional
StructScan method for binding the columns for a row result to a
struct.
QueryRow can be used to easily query and scan a single value:
In addition to the convenience of inserting, deleting and updating
table rows using a struct, attention has been paid to
performance. Since squalor is carefully constructing the SQL queries
for insertion, deletion and update, it eschews the use of placeholders
in favor of properly escaping values in the query. With the Go MySQL
drivers, this saves a roundtrip to the database for each query because
queries with placeholders must be prepared before being executed.
Marshalling and unmarshalling of data from structs utilizes
reflection, but care is taken to minimize the use of reflection in
order to improve performance. For example, reflection data for models
is cached when the model is bound to a table.
Batch operations are utilized when possible. The Delete, Insert,
Replace, Update and Upsert operations will perform multiple operations
per SQL statement. This can provide an order of magnitude speed
improvement over performing the mutations one row at a time due to
minimizing the network overhead.
3 versions
Latest release: over 2 years ago
1 dependent package
View more package details: https://packages.ecosyste.ms/registries/proxy.golang.org/packages/github.com/square/squalor
View more repository details: http://repos.ecosyste.ms/hosts/GitHub/repositories/square%2Fsqualor
Dependent Repos 3

alecholmes/spotlight
Spotlight is a webapp to for sharing music using Spotify's collaborative playlistsSize: 511 KB - Last synced: 11 months ago - Pushed: almost 7 years ago


rmukubvu/amakhosi
rest servicesSize: 26.7 MB - Last synced: over 1 year ago - Pushed: over 4 years ago

Bmsandoval/ekube
clone of kubert. Testing grpc integrationSize: 115 KB - Last synced: about 2 years ago - Pushed: about 5 years ago

Bmsandoval/wayne
Wayne (Way-In) is an open-source, self-hosted, auth solution written as a GoLang-based micro-service. Local development available via Docker. Wayne is the toughest guy in LetterKenny, let him be your bouncer.Size: 112 KB - Last synced: 11 months ago - Pushed: over 3 years ago

