Tables and Columns¶
We use schema definition syntax simlar to other modern close-to-the-SQL ORMs. A class represents a table, an attribute represents a column, etc. Let’s look at an example:
@dqo.Table
class User:
id = dqo.Column(int, primary_key=True)
name = dqo.Column(str, index=True)
email = dqo.Column(str, null=False, unique=True)
# 'user' is a reserved word, ie a bad
# table name so lets define another
_table_name = 'users'
Note the optional special param _table_name
that can override the default table name derived from the class.
Multi-column Primary Keys
The primary_key
parameter for a column is for convenience. To define a multi-column primary key,
add an attribute to the class:
@dqo.Table
class User:
email = dqo.Column(str)
dob = dqo.Column(date)
_pk = dqo.PrimaryKey(User.email, User.dob)
It’s an error to define more than one primary key on a table (through either syntax).
Multi-column Indexes
Similarly for indexes:
@dqo.Table
class User:
id = dqo.Column(int, primary_key=True)
name = dqo.Column(str)
email = dqo.Column(str)
_idx1 = dqo.Index(User.name, User.email)
Default Databases for a Table
If you don’t want to use the system-wide defaults, you can define table specific defaults on the table. Example:
@dqo.Table
class User:
id = dqo.Column(int, primary_key=True)
name = dqo.Column(str)
_sync_db = dqo.Database(src=[...])
_async_db = dqo.Database(src=[...])