gino.api module¶
-
class
gino.api.Gino(bind=None, model_classes=None, query_ext=True, schema_ext=True, ext=True, **kwargs)[源代码]¶ 基类:
sqlalchemy.sql.schema.MetaDataAll-in-one API class of GINO, providing several shortcuts.
This class is a subclass of SQLAlchemy
MetaData, therefore its instances can be used as a normalMetaDataobject, e.g. used in Alembic. In usual cases, you would want to define one globalGinoinstance, usually under the name ofdb, representing the database used in your application.You may define tables in the official way SQLAlchemy core recommended, but more often in GINO we define model classes with
db.Modelas their parent class to represent tables, for its objective interface and CRUD operations. Please read CRUD for more information.For convenience,
Ginoinstance delegated all properties publicly exposed bysqlalchemy, so that you can define tables / models without importingsqlalchemy:id = db.Column(db.BigInteger(), primary_key=True)
Similar to
MetaData, aGinoobject can bind to aGinoEngineinstance, hereby allowing "implicit execution" through theginoextension onExecutableorSchemaItemconstructs:await User.query.gino.first() await db.gino.create_all()
Differently, GINO encourages the use of implicit execution and manages transactional context correctly.
Binding to a connection object is not supported.
To set a bind property, you can simply set your
GinoEngineobject ondb.bind, or set it toNoneto unbind. However, the creation of engine usually happens at the same time. Therefore, GINO provided several convenient ways doing so:with_bind()returning an asynchronous context manager:async with db.with_bind('postgresql://...') as engine:
set_bind()andpop_bind():engine = await db.set_bind('postgresql://...') await db.pop_bind().close()
Directly
awaitonGinoinstance:db = await gino.Gino('postgresql://...') await db.pop_bind().close()
注解
SQLAlchemy allows creating the engine by:
metadata.bind = 'postgresql://...'
While in GINO this only sets a string to
bind, because creating an engine requiresawait, which is exactly whatset_bind()does.At last,
Ginodelegates all query APIs on the boundGinoEngine.- 参数
bind -- A
GinoEngineinstance to bind. Also accepts string orURL, which will be passed tocreate_engine()when thisGinoinstance is awaited. Default isNone.model_classes -- A
tupleof base class and mixin classes to create theModelclass. Default is(CRUDModel, ).query_ext -- Boolean value to control the installation of the
ginoextension onExecutablefor implicit execution. Default is to install (True).schema_ext -- Boolean value to control the installation of the
ginoextension onSchemaItemfor implicit execution. Default is to install (True).ext -- Boolean value to control the installation of the two
ginoextensions.Falsefor no extension at all, while it depends on the two individual switches when this is set toTrue(default).kwargs -- Other arguments accepted by
MetaData.
-
property
Model¶ Declarative base class for models, subclass of
gino.declarative.Model. Defining subclasses of this class will result new tables added to thisGinometadata.
-
acquire(*args, **kwargs)[源代码]¶ A delegate of
GinoEngine.acquire().
-
property
bind¶ An
GinoEngineto which thisGinois bound.This is a simple property with no getter or setter hook - what you set is what you get. To achieve the same result as it is in SQLAlchemy - setting a string or
URLand getting an engine instance, useset_bind()(orawaiton thisGinoobject after setting a string orURL).
-
compile(elem, *multiparams, **params)[源代码]¶ A delegate of
GinoEngine.compile().
-
iterate(clause, *multiparams, **params)[源代码]¶ A delegate of
GinoEngine.iterate().
-
model_base_classes= (<class 'gino.crud.CRUDModel'>,)¶ Overridable default model classes to build the
Model.Default is
(CRUDModel, ).
-
no_delegate= {'create_engine', 'engine_from_config'}¶ A set of symbols from
sqlalchemywhich is not delegated byGino.
-
pop_bind()[源代码]¶ Unbind self, and return the bound engine.
This is usually used in a chained call to close the engine:
await db.pop_bind().close()
- 返回
GinoEngineorNoneif self is not bound.
-
query_executor¶ The overridable
ginoextension class onExecutable.This class will be set as the getter method of the property
ginoonExecutableand its subclasses, ifextandquery_extarguments are bothTrue. Default isGinoExecutor.GinoExecutor的别名
-
schema_visitor¶
-
transaction(*args, **kwargs)[源代码]¶ A delegate of
GinoEngine.transaction().
-
with_bind(bind, loop=None, **kwargs)[源代码]¶ Shortcut for
set_bind()andpop_bind()plus closing engine.This method accepts the same arguments of
create_engine(). This allows inline creating an engine and binding self on enter, and unbinding self and closing the engine on exit:async with db.with_bind('postgresql://...') as engine: # play with engine
- 返回
An asynchronous context manager.
-
class
gino.api.GinoExecutor(query)[源代码]¶ 基类:
objectThe default
ginoextension onExecutableconstructs for implicit execution.Instances of this class are created when visiting the
ginoproperty ofExecutableinstances (also referred as queries or clause elements), for example:await User.query.gino.first()
This allows GINO to add the asynchronous query APIs (
all(),first(),one(),one_or_none(),scalar(),status(),iterate()) to SQLAlchemy query clauses without messing up with existing synchronous ones. Calling these asynchronous query APIs has the same restriction - the relevant metadata (theGinoinstance) must be bound to an engine, or anAttributeErrorwill be raised.注解
Executable clause elements that are completely irrelevant with any table - for example
db.select([db.text('now()')])- has no metadata, hence no engine. Therefore, this will always fail:await db.select([db.text('now()')]).gino.scalar()
You should use
conn.scalar(),engine.scalar()or evendb.scalar()in this case.-
iterate(*multiparams, **params)[源代码]¶ Returns
engine.iterate()with this query as the first argument, and other arguments followed, whereengineis theGinoEngineto which the metadata (Gino) is bound, while metadata is found in this query.
-
load(value)[源代码]¶ Shortcut to set execution option
loaderin a chaining call.For example to load
Bookinstances with their authors:query = Book.join(User).select() books = await query.gino.load(Book.load(author=User)).all()
Read
execution_options()for more information.
-
model(model)[源代码]¶ Shortcut to set execution option
modelin a chaining call.Read
execution_options()for more information.
-
property
query¶ Get back the chained
Executable.In a chained query calls, occasionally the previous query clause is needed after a
.gino.chain, you can use.query.to resume the chain back. For example:await User.query.gino.model(FOUser).query.where(...).gino.all()
-
return_model(switch)[源代码]¶ Shortcut to set execution option
return_modelin a chaining call.Read
execution_options()for more information.
-
timeout(timeout)[源代码]¶ Shortcut to set execution option
timeoutin a chaining call.Read
execution_options()for more information.
-