引擎
是任何SQLAlchemy应用程序的基础。它是实际数据库及其DBAPI的“主基”,通过连接池和Dialect
传递给SQLAlchemy应用程序,该应用程序描述了如何与特定类型的数据库/ DBAPI组合。
一般结构如下:
在上面,Engine
引用了Dialect
和Pool
,它们共同解释了DBAPI的模块功能以及数据库的行为。
只用一个调用就可以创建引擎,create_engine()
:
from sqlalchemy import create_engine
engine = create_engine('postgresql://scott:tiger@localhost:5432/mydatabase')
The above engine creates a Dialect
object tailored towards PostgreSQL, as well as a Pool
object which will establish a DBAPI connection at localhost:5432
when a connection request is first received.Note that the Engine
and its underlying Pool
do not establish the first actual DBAPI connection until the Engine.connect()
method is called, or an operation which is dependent on this method such as Engine.execute()
is invoked. In this way, Engine
and Pool
can be said to have a lazy initialization behavior.
Engine
一旦创建,可以直接用于与数据库进行交互,也可以将其传递给Session
对象以使用ORM。本节将介绍配置Engine
的详细信息。下一节Working with Engines and Connections将详细介绍Engine
的类似API,通常用于非ORM应用程序。
SQLAlchemy includes many Dialect
implementations for various backends. 最常用数据库的方言包含在SQLAlchemy中;少数其他人需要另外安装一个单独的方言。
有关各种可用后端的信息,请参阅Dialects部分。
create_engine()
函数根据URL生成一个Engine
对象。这些URL遵循RFC-1738,通常可以包含用户名,密码,主机名,数据库名称以及用于其他配置的可选关键字参数。在某些情况下,接受文件路径,而在其他情况下,“数据源名称”替换“主机”和“数据库”部分。数据库URL的典型形式是:
dialect+driver://username:password@host:port/database
方言名称包括SQLAlchemy方言的名称,名称如sqlite
,mysql
,postgresql
,oracle
,或mssql
。drivername是用于使用全部小写字母连接到数据库的DBAPI的名称。如果未指定,则将导入“默认”DBAPI(如果可用) - 此默认值通常是该后端可用的最广泛的驱动程序。
以下是常用连接样式的示例。有关所有包含方言的详细信息的完整索引以及第三方方言的链接,请参见Dialects。
Postgresql方言使用psycopg2作为默认的DBAPI。pg8000也可用作纯Python替代品:
# default
engine = create_engine('postgresql://scott:tiger@localhost/mydatabase')
# psycopg2
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')
# pg8000
engine = create_engine('postgresql+pg8000://scott:tiger@localhost/mydatabase')
有关在PostgreSQL连接到Postgresql的更多注意事项。
MySQL方言使用mysql-python作为默认的DBAPI。有许多MySQL DBAPI可用,包括MySQL连接器-python和OurSQL:
# default
engine = create_engine('mysql://scott:tiger@localhost/foo')
# mysql-python
engine = create_engine('mysql+mysqldb://scott:tiger@localhost/foo')
# MySQL-connector-python
engine = create_engine('mysql+mysqlconnector://scott:tiger@localhost/foo')
# OurSQL
engine = create_engine('mysql+oursql://scott:tiger@localhost/foo')
有关在MySQL连接到MySQL的更多注意事项。
Oracle方言使用cx_oracle作为默认的DBAPI:
engine = create_engine('oracle://scott:tiger@127.0.0.1:1521/sidname')
engine = create_engine('oracle+cx_oracle://scott:tiger@tnsname')
有关在Oracle连接到Oracle的更多注意事项。
SQL Server方言使用pyodbc作为默认DBAPI。pymssql也可用:
# pyodbc
engine = create_engine('mssql+pyodbc://scott:tiger@mydsn')
# pymssql
engine = create_engine('mssql+pymssql://scott:tiger@hostname:port/dbname')
有关在Microsoft SQL Server连接到SQL Server的更多注意事项。
SQLite默认使用Python内置模块sqlite3
连接到基于文件的数据库。
由于SQLite连接到本地文件,URL格式略有不同。URL的“文件”部分是数据库的文件名。对于相对文件路径,这需要三个斜杠:
# sqlite://<nohostname>/<path>
# where <path> is relative:
engine = create_engine('sqlite:///foo.db')
对于绝对文件路径,三个斜杠后面是绝对路径:
#Unix/Mac - 4 initial slashes in total
engine = create_engine('sqlite:////absolute/path/to/foo.db')
#Windows
engine = create_engine('sqlite:///C:\\path\\to\\foo.db')
#Windows alternative using raw string
engine = create_engine(r'sqlite:///C:\path\to\foo.db')
要使用SQLite :memory:
数据库,请指定一个空的URL:
engine = create_engine('sqlite://')
有关在SQLite连接到SQLite的更多注意事项。
sqlalchemy。
create_engine
( * args,** kwargs / T5> ¶ T6>创建一个新的Engine
实例。
标准调用形式是将URL作为第一个位置参数发送,通常是指示数据库方言和连接参数的字符串:
engine = create_engine("postgresql://scott:tiger@localhost/test")
附加的关键字参数可以在它后面建立,它们在结果Engine
及其底层Dialect
和Pool
结构上建立各种选项:
engine = create_engine("mysql://scott:tiger@hostname/dbname",
encoding='latin1', echo=True)
URL的字符串形式是dialect[+driver]://user:password@host/dbname[?key=value..]
,其中dialect
是一个数据库名称,如mysql
,oracle
,postgresql
等,driver
DBAPI的名称,例如psycopg2
,pyodbc
,cx_oracle
等或者,该URL可以是URL
的实例。
**kwargs
takes a wide variety of options which are routed towards their appropriate components. 参数可能特定于Engine
,底层的Dialect
以及Pool
。特定的方言也接受该方言所独有的关键字参数。Here, we describe the parameters that are common to most create_engine()
usage.
一旦建立,一旦Engine.connect()
被调用,新生成的Engine
将请求来自底层Pool
的连接,例如Engine.execute()
被调用。当接收到这个请求时,Pool
反过来将建立第一个实际的DBAPI连接。The create_engine()
call itself does not establish any actual DBAPI connections directly.
参数: |
|
---|
sqlalchemy。
engine_from_config
( configuration,prefix ='sqlalchemy。', ** kwargs T5> ) T6> ¶ T7>使用配置字典创建一个新的引擎实例。
字典通常由配置文件生成。
对engine_from_config()
感兴趣的键应加上前缀,例如“ sqlalchemy.url
,sqlalchemy.echo
等'prefix'参数表示要搜索的前缀。每个匹配键(在前缀被剥离后)都被视为是create_engine()
调用的对应关键字参数。
唯一需要的密钥是(假设默认前缀)sqlalchemy.url
,它提供database URL。
一组选定的关键字参数将根据字符串值“强制”为其预期类型。这组参数是使用engine_config_types
存取器的可扩展每个方言。
参数: |
|
---|
sqlalchemy.engine.url。 T0> make_url T1> ( T2> name_or_url T3> ) T4> ¶< / T5>
给定一个字符串或unicode实例,产生一个新的URL实例。
给定的字符串根据RFC 1738规范进行分析。如果传递一个现有的URL对象,只返回该对象。
sqlalchemy.engine.url。
URL
( drivername,=无,密码=无,主机=无,端口=无,数据库=无 ,query = None t>> ) ¶表示用于连接到数据库的URL的组件。
该对象适合直接传递给create_engine()
调用。URL的字段由make_url()
函数从字符串中解析。该URL的字符串格式是RFC-1738样式的字符串。
所有初始化参数都可用作公共属性。
参数: |
---|
get_dialect T0> ( T1> ) T2> ¶ T3>
返回与此URL的驱动程序名称对应的SQLAlchemy数据库方言类。
当connect()
或execute()
方法被调用时,Engine
会向连接池询问连接。默认连接池QueuePool
将根据需要打开到数据库的连接。As concurrent statements are executed, QueuePool
will grow its pool of connections to a default size of five, and will allow a default “overflow” of ten. 由于Engine
实质上是连接池的“主基地”,因此应该为应用程序中建立的每个数据库保留一个Engine
,而不是创建一个新的为每个连接。
有关连接池的更多信息,请参阅Connection Pooling。
在发布connect()
调用到底层DBAPI时使用的自定义参数可能以三种不同的方式发布。可以直接从URL字符串中传递基于字符串的参数作为查询参数:
db = create_engine('postgresql://scott:tiger@localhost/test?argument1=foo&argument2=bar')
如果SQLAlchemy的数据库连接器知道特定的查询参数,它可能会将其类型从字符串转换为适当的类型。
create_engine()
还有一个参数connect_args
,它是一个将传递给connect()
的附加字典。这可以在需要字符串以外的参数时使用,并且SQLAlchemy的数据库连接器对该参数没有类型转换逻辑:
db = create_engine('postgresql://scott:tiger@localhost/test', connect_args = {'argument1':17, 'argument2':'bar'})
全部最可定制的连接方法是传递一个creator
参数,该参数指定一个返回DBAPI连接的可调用对象:
def connect():
return psycopg.connect(user='scott', host='localhost')
db = create_engine('postgresql://', creator=connect)
Python的标准logging模块用于通过SQLAlchemy实现信息和调试日志输出。这允许SQLAlchemy的日志记录与其他应用程序和库以标准方式集成。The echo
and echo_pool
flags that are present on create_engine()
, as well as the echo_uow
flag used on Session
, all interact with regular loggers.
本节假定您熟悉上述链接的日志记录模块。所有由SQLAlchemy执行的日志都存在于sqlalchemy
命名空间下面,正如logging.getLogger('sqlalchemy')
所使用的。当配置日志记录(即通过logging.basicConfig()
)时,可以打开的SA记录器的通用名称空间如下所示:
sqlalchemy.engine
- 控制SQL回显。对于SQL查询输出设置为logging.INFO
,对于查询+结果集输出设置为logging.DEBUG
。sqlalchemy.dialects
- 控制SQL方言的自定义日志记录。有关详细信息,请参阅单个方言的文档。sqlalchemy.pool
- 控制连接池日志记录。设置为logging.INFO
或更低以记录连接池检出/检入。sqlalchemy.orm
- 控制各种ORM功能的记录。设置为logging.INFO
以获取有关映射器配置的信息。例如,要使用Python日志记录来记录SQL查询,而不是echo=True
标志:
import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
默认情况下,日志级别在整个sqlalchemy
名称空间内设置为logging.WARN
,因此即使在启用了日志记录的应用程序中也不会发生日志操作。
echo
标志作为create_engine()
等关键字参数以及Engine
上的echo
属性存在,当设置为True
时,将首先尝试确保启用日志记录。不幸的是,logging
模块没有提供确定输出是否已经配置的方法(注意我们指的是是否设置了日志配置,而不仅仅是设置日志级别)。因此,任何echo=True
标志都将导致使用sys.stdout作为目标对logging.basicConfig()
的调用。它还使用级别名称,时间戳和记录器名称设置默认格式。请注意,此配置具有将配置为到任何现有记录器配置的作用。Therefore, when using Python logging, ensure all echo flags are set to False at all times, to avoid getting duplicate log lines.
实例的记录器名称(如Engine
或Pool
)默认使用截断的十六进制标识符字符串。要将其设置为特定名称,请使用sqlalchemy.create_engine()
中的“logging_name”和“pool_logging_name”关键字参数。
注意
SQLAlchemy Engine
通过在当前日志记录级别被检测为logging.INFO
或logging.DEBUG
时仅发出日志语句来节省Python函数调用开销。它仅在从连接池获取新连接时才检查此级别。因此,在更改已运行的应用程序的日志记录配置时,当前处于活动状态的任何Connection
或更常见的在事务中处于活动状态的Session
对象都不会记录任何SQL根据新配置直到获取新的Connection
(在Session
的情况下,这是在当前事务结束并且新的开始之后)。