sql 模块

此文件是Web2py Web框架的一部分
由Massimo di Pierro<mdipierro@cs.depaul.edu>开发,
limbodo<limbodo@gmail.com>和srackham<srackham@gmail.com>。

只是为了向后兼容

class gluon.sql.DAL(*args, **kwargs)[源代码]

基类:pydal.helpers.classes.Serializable, pydal.helpers.classes.BasicStorage

此类的实例表示数据库连接

参数
  • uri (str) --

    包含连接到数据库的信息。默认为 'sqlite://dummy.db'

    注解

    实验:可以将字典指定为uri参数,即使用:

    db = DAL({"uri": "sqlite://storage.sqlite",
              "tables": {...}, ...})
    

    对于dict输入的示例,可以使用

    AsScript()

    请注意,为了与2.6.5版之前的Python兼容,由于Kwarg名称的语法限制,您应该将dict输入键强制转换为str。要正确输入DAL字典,您可以使用以下选项之一:

    obj = serializers.cast_keys(dict, [encoding="utf-8"])
    #or else (for parsing json input)
    obj = serializers.loads_json(data, unicode_keys=False)
    

  • pool_size -- 要与数据库对象建立多少打开的连接。

  • folder -- 其中将创建.table文件。在web2py中自动设置。在web2py外部使用dal时使用显式路径

  • db_codec -- 数据库的字符串编码(默认值:“utf-8”)

  • table_hash -- 带有.tables的数据库标识符。如果连接哈希发生更改,则仍可以使用旧的.tables(如果它们的前缀为db_hash)

  • check_reserved -- 根据SQL/NoSQL保留关键字检查表名和列名的适配器列表。默认为 None -“common”所有数据库类型(如“select,insert”)通用的SQL关键字列表。(推荐)-'all'检查所有已知的SQL关键字-“<adaptername>”,检查特定的适配器关键字列表-“<adaptername>不响应”检查特定的适配器不响应关键字列表。(如果有的话)

  • migrate -- 设置所有表的默认迁移行为

  • fake_migrate -- 为所有表设置默认的假迁移行为

  • migrate_enabled -- 如果设置为false,则禁用所有迁移

  • fake_migrate_all -- 如果设置为true,则假迁移所有表

  • attempts -- 尝试连接的次数

  • auto_import -- 如果设置为true,则尝试从“数据库”文件夹中自动导入表定义(仅适用于简单模型)

  • bigint_id -- 如果已设置,请为ID和引用字段启用bigint而不是int。

  • lazy_tables -- 将表定义延迟到表访问

  • after_connection -- 连接后将执行的可调用文件

例子

用作:

db = DAL('sqlite://test.db')

或:

db = DAL(**{"uri": ..., "tables": [...]...}) # experimental

db.define_table('tablename', Field('fieldname1'),
                             Field('fieldname2'))
class Field(*args, **kwargs)

基类:pydal.objects.Expression, pydal.helpers.classes.Serializable

Lazy

FieldMethod 的别名

Method

FieldMethod 的别名

Virtual

FieldVirtual 的别名

as_dict(flat=False, sanitize=True)
bind(table)
clone(point_self_references_to=False, **args)
count(distinct=None)
formatter(value)
property longname
retrieve(name, path=None, nameonly=False)

如果 nameonly==True 返回(filename,fullfilename)而不是(filename,stream)

retrieve_file_properties(name, path=None)
set_attributes(*args, **attributes)
property sqlsafe
property sqlsafe_name
store(file, filename=None, path=None)
validate(value, record_id=None)
class Row(*args, **kwargs)

基类:pydal.helpers.classes.BasicStorage

一本能让你做数据的字典。 ['a'] 和D.A一样,这只用于存储 Row

as_dict(datetime_to_str=False, custom_types=None)
as_json(mode='object', default=None, colnames=None, serialize=True, **kwargs)

将行序列化为JSON对象。Kwargs将传递给。仅支持“Object”模式。

serialize = False 由rows.as_json使用

TODO:按查询列顺序返回数组模式

未实现模式和列名

as_xml(row_name='row', colnames=None, indent=' ')
get(key, default=None)
class Rows(db=None, records=[], colnames=[], compact=True, rawrows=None, fields=[])

基类:pydal.objects.BasicRows

select返回值的包装。它基本上代表一个表。它有一个迭代器,每一行表示为 Row 字典。

append(row)
column(column=None)
exclude(f)

从调用行对象中删除元素,由函数筛选 f ,并返回包含已删除元素的New Rows对象

find(f, limitby=None)

返回由函数筛选的新行对象(原始对象的子集) f

first()
group_by_value(*fields, **args)

按字段之一重新分组行

insert(position, row)
join(field, name=None, constraint=None, fields=[], orderby=None)
last()
render(i=None, fields=None)

获取索引并返回索引行的副本,其中的值通过关联字段的“表示”属性转换。

参数
  • i -- 索引。如果未指定,则返回一个生成器以对所有行进行迭代。

  • fields -- 要转换的字段列表(如果没有,则将转换具有“表示”属性的所有字段)

setvirtualfields(**keyed_virtualfields)

参考文献:

db.define_table('x', Field('number', 'integer'))
if db(db.x).isempty(): [db.x.insert(number=i) for i in range(10)]

from gluon.dal import lazy_virtualfield

class MyVirtualFields(object):
    # normal virtual field (backward compatible, discouraged)
    def normal_shift(self): return self.x.number+1
    # lazy virtual field (because of @staticmethod)
    @lazy_virtualfield
    def lazy_shift(instance, row, delta=4): return row.x.number+delta
db.x.virtualfields.append(MyVirtualFields())

for row in db(db.x).select():
    print row.number, row.normal_shift, row.lazy_shift(delta=7)
sort(f, reverse=False)

返回已排序元素的列表(未就地排序)

class Table(db, tablename, *fields, **args)

基类:pydal.helpers.classes.Serializable, pydal.helpers.classes.BasicStorage

表示数据库表

例子::
可以将表创建为:

db=dal(…)db.define_table('users',field('name'))

然后::

db.users.insert(name='me') # print db.users._insert(...) to see SQL
db.users.drop()
as_dict(flat=False, sanitize=True)
bulk_insert(items)

这是字典的列表

create_index(name, *fields, **kwargs)
drop(mode='')
drop_index(name)
property fields
import_from_csv_file(csvfile, id_map=None, null='<NULL>', unique='uuid', id_offset=None, transform=None, validate=False, encoding='utf-8', **kwargs)

从csv文件导入记录。列标题必须与表字段具有相同的名称。字段“id”被忽略。如果列名为'table.file'则忽略'table.'前缀。

  • “unique”参数是一个必须唯一的字段(通常是一个uuid字段)

  • “restore”参数是默认值false;如果设置为true,将首先删除表中的旧值。

  • “id_map”如果设置为“none”,则不会映射ID

导入将在还原的表中保留ID号。这假设有一个ID类型的字段是整数,并且是递增的。将保留还原表中的ID号。

insert(**fields)
on(query)
query_name(*args, **kwargs)
property sql_fullref
property sql_shortref
property sqlsafe
property sqlsafe_alias
truncate(mode='')
update(*args, **kwargs)
update_or_insert(_key=<function <lambda>>, **values)
validate_and_insert(**fields)
validate_and_update(_key, **fields)
validate_and_update_or_insert(_key=<function <lambda>>, **fields)
with_alias(alias)
as_dict(flat=False, sanitize=True)[源代码]
can_join()[源代码]
check_reserved_keyword(name)[源代码]

验证 name 对照sql关键字使用self.u checku reserved,这是要使用的运算符列表。

close()[源代码]
commit()[源代码]
define_table(tablename, *fields, **kwargs)[源代码]
static distributed_transaction_begin(*instances)[源代码]
static distributed_transaction_commit(*instances)[源代码]
executesql(query, placeholders=None, as_dict=False, fields=None, colnames=None, as_ordered_dict=False)[源代码]

执行任意查询

参数
  • query (str) -- 要提交到后端的查询

  • placeholders -- 是可选的,并且始终为无。如果将原始SQL与占位符一起使用,则占位符可能是要在或(如果数据库驱动程序支持)中替换的值序列,该字典中的键与SQL中的命名占位符匹配。

  • as_dict -- 使用DAL时始终为“无”。如果可以将using raw sql设置为true,并且db驱动程序返回的结果光标将转换为使用db字段名键入的字典序列。返回as_dict=true的结果与将.to_list()应用于DAL查询时返回的结果相同。如果“as _ordered_dict”=true,则行为与当“as _dict”=true时相同,保证键(字段名)的顺序与数据库上执行的select name返回的顺序相同。

  • fields -- 与从数据库返回的字段匹配的DAL字段列表。字段对象应该是DAL对象上定义的一个或多个表对象的一部分。“字段”列表可以包括一个或多个DAL表对象,除了或不包括字段对象,也可以只是一个表(不在列表中)。在这种情况下,将从表中提取字段对象。…注意::如果有 fieldscolnames 如果提供,结果将转换为DAL Rows 对象使用 db._adapter.parse() 方法

  • colnames -- tablename.fieldname格式的字段名列表

注解

也可以同时指定“字段”和相关的“列名”。在这种情况下,“字段”除了字段对象之外还可以包括DAL表达式对象。对于“字段”中的字段对象,关联的“colname”必须仍然采用tablename.fieldname格式。对于“字段”中的表达式对象,关联的“列名”可以是任意标签。

“fields”或“colname”引用的dal表对象可以是虚拟表,不必表示数据库中的任何实表。另外,请注意,“字段”和“列名”的顺序必须与从数据库返回的结果光标中的字段的顺序相同。

execution_handlers = [<class 'pydal.helpers.classes.TimingHandler'>]
export_to_csv_file(ofile, *args, **kwargs)[源代码]
static get_instances()[源代码]

返回一个以uri作为键的字典,其中包含计时和定义的表::

{'sqlite://storage.sqlite': {
    'dbstats': [(select auth_user.email from auth_user, 0.02009)],
    'dbtables': {
        'defined': ['auth_cas', 'auth_event', 'auth_group',
            'auth_membership', 'auth_permission', 'auth_user'],
        'lazy': '[]'
        }
    }
}
has_representer(name)[源代码]
import_from_csv_file(ifile, id_map=None, null='<NULL>', unique='uuid', map_tablenames=None, ignore_missing_tables=False, *args, **kwargs)[源代码]
import_table_definitions(path, migrate=False, fake_migrate=False, tables=None)[源代码]
lazy_define_table(tablename, *fields, **kwargs)[源代码]
logger = <Logger pyDAL (WARNING)>
parse_as_rest(patterns, args, vars, queries=None, nested_select=True)[源代码]
record_operators = {'delete_record': <class 'pydal.helpers.classes.RecordDeleter'>, 'update_record': <class 'pydal.helpers.classes.RecordUpdater'>}
represent(name, *args, **kwargs)[源代码]
representers = {'rows_render': <function represent>, 'rows_xml': <class 'gluon.sqlhtml.SQLTABLE'>}
rollback()[源代码]
serializers = {'json': <function custom_json>, 'xml': <function xml>}
static set_folder(folder)[源代码]
smart_query(fields, text)[源代码]
property tables
uuid()
validators = None
validators_method(field)

字段类型验证,使用Web2py的验证机制。

确保字段的内容与声明的FieldType一致

where(query=None, ignore_common_filters=None)[源代码]
class gluon.sql.Field(*args, **kwargs)[源代码]

基类:pydal.objects.Expression, pydal.helpers.classes.Serializable

Lazy

表示数据库字段

例子

用法:

a = Field(name, 'string', length=32, default=None, required=False,
    requires=IS_NOT_EMPTY(), ondelete='CASCADE',
    notnull=False, unique=False,
    regex=None, options=None,
    uploadfield=True, widget=None, label=None, comment=None,
    uploadfield=True, # True means store on disk,
                      # 'a_field_name' means store in this field in db
                      # False means file content will be discarded.
    writable=True, readable=True, searchable=True, listable=True,
    update=None, authorize=None,
    autodelete=False, represent=None, uploadfolder=None,
    uploadseparate=False # upload to separate directories by uuid_keys
                         # first 2 character and tablename.fieldname
                         # False - old behavior
                         # True - put uploaded file in
                         #   <uploaddir>/<tablename>.<fieldname>/uuid_key[:2]
                         #        directory)
    uploadfs=None        # a pyfilesystem where to store upload
    )

用作 DAL.define_table

FieldMethod 的别名

Method

FieldMethod 的别名

Virtual

FieldVirtual 的别名

as_dict(flat=False, sanitize=True)[源代码]
bind(table)[源代码]
clone(point_self_references_to=False, **args)[源代码]
count(distinct=None)[源代码]
formatter(value)[源代码]
property longname
retrieve(name, path=None, nameonly=False)[源代码]

如果 nameonly==True 返回(filename,fullfilename)而不是(filename,stream)

retrieve_file_properties(name, path=None)[源代码]
set_attributes(*args, **attributes)[源代码]
property sqlsafe
property sqlsafe_name
store(file, filename=None, path=None)[源代码]
validate(value, record_id=None)[源代码]