我们构建2张表,后面示例使用:
db.define_table('person',#表名
Field('id', 'string'),#字段名及字段的数据类型
?? Field(‘name', 'string'),
?? Field(‘dept', 'string'), )
db.define_table('things',
Field('id', 'string'),
Field(‘name', 'string'),
?? Field(‘owner', 'string'), )
db.person.drop(),删除整张表
???? 如果单独用pyDAL,对表级别的操作(建表、删表、增删改表字段)可以用数据库客户端或者其他工具,但是在变动后需要在python代码中同步进行db.define_table的匹配定义变更,同时db对象初始化是的migrate_enabled为True;
migrate_enabled为True有以下自动特性:
(1)define_table?checks whether or not the corresponding table exists. If it does not, it generates the SQL to create it and executes the SQL.
检查define_table()的字段是否已存在,不存在的执行SQL扩展字段,如果用数据库客户端或者其他工具扩展字段,但是没有用define_table()同步引入相关字段,那这个字段在pyDAL中是无法使用的
(2)If the table does exist but differs from the one being defined, it generates the SQL to alter the table and executes it.
(3)If a field has changed type but not name, it will try to convert the data type
如果表和字段已存在,就检查表的字段,以及字段的数据类型在数据库中和define_table()是否一致,如果不一致,则自动执行SQL更改字段数据类型。
field type | default field validators |
string | IS_LENGTH(length)?default length is 512 |
text | IS_LENGTH(length)?default length is 32768 |
blob | None?default length is 2**31 (2 GiB) |
boolean | None |
integer | IS_INT_IN_RANGE(-2**31, 2**31) |
double | IS_FLOAT_IN_RANGE(-1e100, 1e100) |
decimal(n,m) | IS_DECIMAL_IN_RANGE(-10**10, 10**10) |
date | IS_DATE() |
time | IS_TIME() |
datetime | IS_DATETIME() |
password | IS_LENGTH(length)?default length is 512 |
upload | None?default length is 512 |
reference <table> | IS_IN_DB(db, table.field, format) |
list:string | None |
list:integer | None |
list:reference <table> | IS_IN_DB(db, table._id, format, multiple=True) |
json | IS_EMPTY_OR(IS_JSON())?default length is 512 |
bigint | IS_INT_IN_RANGE(-2**63, 2**63) |
big-id | None |
big-reference | None |
(1)pyDAL是个适配多种数据库的ORM,使用其他工具进行建表时,要注意pyDAL与原生数据库的数据类型的对应关系,这是使用任何ORM都要注意的问题
(2)字段长度(varchar/string最好能限定长度, MySQL要求一个行的定义长度不能超过65535字节)