I did some basic cleaning of the code, turned it into a Python package, and pushed it to Launchpad. I also added some minor changes, such as introducing a
define
function to define new tables instead of automatically creating one when an insert was executed. Automatically constructing a table from values seems neat, but in reality it is quite difficult to ensure that it has the right types for the application. Here is a small code example demonstrating how to use the define
function together with some other operations. import mysql.api.simple as api server = api.Server(host="example.com") server.test_api.tbl.define( { 'name': 'more', 'type': int }, { 'name': 'magic', 'type': str }, ) items = [ {'more': 3, 'magic': 'just a test'}, {'more': 3, 'magic': 'just another test'}, {'more': 4, 'magic': 'quadrant'}, {'more': 5, 'magic': 'even more magic'}, ] for item in items: server.test_api.tbl.insert(item)The table is defined by providing a dictionary for each row that you want in the table. The two most important fields in the dictionary is name and type. The name field is used to supply a name for the field, and the type field is used to provide a type of the column. The type is denoted using a basic Python type constructor, which then maps internally to a SQL type. So, for example,
int
map to the SQL INT
type, and bool
map to the SQL type BIT(1)
. This choice of deciding to use Python types are simply because it is more natural for a Python programmer to define the tables from the data that the programmer want to store in the database. I this case, I would be less concerned with how the types are mapped, just assuming that it is mapped in a way that works. It is currently not possible to register your own mappings, but that is easy to add.So, why provide the type object and not just a string with the type name? The idea I had here is that since Python has introspection (it is a dynamic language after all), it would be possible to add code that read the provided type objects and do things with them, such as figuring out what fields there are in the type. It's not that I plan to implement this, but even though this is intended to be a simple database interface, there is no reason to tie ones hands from start, so this simple approach will provide some flexibility if needed in the future. Links
Some additional links that you might find useful:- Connector/Python
- You need to have Connector/Python installed to be able to use this package.
- Sequalize
- This is a JavaScript library that provide a similar interface to a database. It claims to be an ORM layer, but is not really. It is more similar to what I have written above.
- Roland's MQL to SQL and Presentation on SlideShare is also some inspiration for alternatives.