引擎配置¶
引擎
是任何 SQLAlchemy 应用程序的起点。它是实际数据库及其 DBAPI 的 “大本营”,通过连接池和 Dialect 交付给 SQLAlchemy 应用程序,Dialect
描述了如何与特定类型的数据库/DBAPI 组合通信。
一般结构可以说明如下:

其中,Engine
引用了
Dialect
和 Pool
一起解释 DBAPI 的模块功能以及数据库的行为。
创建引擎只是发出单个调用的问题,
create_engine()
中:
from sqlalchemy import create_engine
engine = create_engine("postgresql+psycopg2://scott:tiger@localhost:5432/mydatabase")
上述引擎会创建一个为 PostgreSQL 量身定制的 Dialect
对象,以及一个 Pool
对象,该对象将在首次收到连接请求时在 localhost:5432
建立 DBAPI 连接。请注意,Engine
及其底层
在
Engine.connect()
或 Engine.begin()
之前,池不会建立第一个实际的 DBAPI 连接
方法。 这些方法中的任何一个也可以由其他
SQLAlchemy Engine
依赖对象,例如 ORM
Session
对象。这样,可以说 Engine
和 Pool
具有惰性初始化行为。
Engine 一旦创建,就可以直接用于与数据库交互,也可以传递给
Session
对象以使用 ORM。本节介绍配置 Engine
的详细信息。下一节 使用引擎和连接 将详细介绍 Engine
的使用 API 和类似 API,通常用于非 ORM 应用程序。
支持的数据库¶
SQLAlchemy 包含许多用于各种后端的 Dialect
实现。最常见数据库的方言包含在 SQLAlchemy 中;少数其他应用程序需要额外安装单独的方言。
请参阅 Dialects 部分 以获取有关各种可用后端的信息。
数据库 URL¶
create_engine()
函数生成一个 Engine
对象。URL 的格式通常遵循 RFC-1738,但有一些例外,包括在“scheme”部分接受下划线,而不是破折号或句点。URL 通常包括用户名、密码、主机名、数据库名称字段,以及用于其他配置的可选关键字参数。在某些情况下,接受文件路径,而在其他情况下,“数据源名称”将替换“主机”和“数据库”部分。数据库 URL 的典型形式是:
dialect+driver://username:password@host:port/database
方言名称包括 SQLAlchemy 方言的标识名称,该名称如 sqlite
、mysql
、postgresql
、oracle
或 mssql
。drivername 是用于使用全小写字母连接到数据库的 DBAPI 的名称。如果未指定,则将导入“默认”DBAPI(如果可用) - 此默认通常是该后端可用的最广为人知的驱动程序。
在密码中转义特殊字符,例如 @ 符号¶
构造要传递给
create_engine()
)、特殊字符(例如可能
在用户中使用,并且密码需要进行URL编码才能正确解析..
这包括 @ 符号。
下面是包含密码“kx@jj5/g”
的 URL 示例,其中“at”符号和斜杠字符分别表示为 %40
和 %2F
:
postgresql+pg8000://dbuser:kx%40jj5%2Fg@pghost10/appdb
上述密码的编码可以使用
urllib.parse 中:
>>> import urllib.parse
>>> urllib.parse.quote_plus("kx@jj5/g")
'kx%40jj5%2Fg'
然后,可以将 URL 作为字符串传递给 create_engine():
from sqlalchemy import create_engine
engine = create_engine("postgresql+pg8000://dbuser:kx%40jj5%2Fg@pghost10/appdb")
作为转义特殊字符以创建完整 URL 字符串的替代方法,传递给 create_engine()
的对象可以是 URL
对象的实例,该实例绕过解析阶段,可以直接容纳未转义的字符串。有关示例,请参阅下一节。
在 1.4 版本发生变更: 修复了对主机名和数据库名称中 @
符号的支持。作为此修复的副作用,必须对密码中的 @
符号进行转义。
以编程方式创建 URL¶
传递给 create_engine()
的值可以是
URL
而不是纯字符串,它绕过了使用字符串解析的需要,因此不需要提供转义的 URL 字符串。
URL
对象是使用 URL.create()
创建的
constructor 方法,单独传递所有字段。 特殊字符
例如密码中的那些可以在不做任何修改的情况下传递:
from sqlalchemy import URL
url_object = URL.create(
"postgresql+pg8000",
username="dbuser",
password="kx@jj5/g", # plain (unescaped) text
host="pghost10",
database="appdb",
)
然后,构造的 URL
对象可以直接传递给
create_engine()
代替字符串参数:
from sqlalchemy import create_engine
engine = create_engine(url_object)
后端特定的 URL¶
常见连接样式的示例如下。有关所有包含的方言的详细信息的完整索引以及指向第三方方言的链接,请参阅 方言。
PostgreSQL的¶
PostgreSQL 方言使用 psycopg2 作为默认 DBAPI。其他 PostgreSQL DBAPI 包括 pg8000 和 asyncpg:
# 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")
MySQL的¶
MySQL 方言使用 mysqlclient 作为默认 DBAPI。还有其他可用的 MySQL DBAPI,包括 PyMySQL:
# default
engine = create_engine("mysql://scott:tiger@localhost/foo")
# mysqlclient (a maintained fork of MySQL-Python)
engine = create_engine("mysql+mysqldb://scott:tiger@localhost/foo")
# PyMySQL
engine = create_engine("mysql+pymysql://scott:tiger@localhost/foo")
有关 MySQL 和 MariaDB 中连接到 MySQL 的更多说明。
预言机¶
首选的 Oracle Database 方言使用 python-oracledb 驱动程序作为 DBAPI:
engine = create_engine(
"oracle+oracledb://scott:tiger@127.0.0.1:1521/?service_name=freepdb1"
)
engine = create_engine("oracle+oracledb://scott:tiger@tnsalias")
由于历史原因,Oracle 方言使用过时的 cx_Oracle 驱动程序作为默认 DBAPI:
engine = create_engine("oracle://scott:tiger@127.0.0.1:1521/?service_name=freepdb1")
engine = create_engine("oracle+cx_oracle://scott:tiger@tnsalias")
有关连接到 Oracle Database 的更多说明,请参阅 Oracle。
Microsoft SQL 服务器¶
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¶
SQLite 默认使用 Python 内置模块 sqlite3
连接到基于文件的数据库。
当 SQLite 连接到本地文件时,URL 格式略有不同。URL 的 “file” 部分是数据库的文件名。对于相对文件路径,这需要三个斜杠:
# 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 的更多说明。
其他¶
请参阅 Dialects,这是所有其他 dialect 文档的顶级页面。
引擎创建 API¶
对象名称 |
描述 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
-
函数 sqlalchemy.create_engine(url:str_url.URL, **kwargs: Any)引擎 ¶
创建新的Engine
实例。
标准的调用形式是将 URL 作为第一个位置参数发送,通常是一个指示数据库方言和连接参数的字符串:engine = create_engine("postgresql+psycopg2://scott:tiger@localhost/test")
注意
请查看数据库 URL,了解编写 URL 字符串的一般准则。特别是,特殊字符(例如通常是密码的一部分)必须进行 URL 编码才能正确解析。
然后,其他关键字参数可能紧随其后,这些参数在生成的Engine
上建立各种选项 及其底层Dialect
和Pool
构建:engine = create_engine( "mysql+mysqldb://scott:tiger@hostname/dbname", pool_recycle=3600, echo=True, )
URL 的字符串形式为dialect[+driver]://user:password@host/dbname[?key=value..]
哪里dialect
是数据库名称,例如mysql
、oracle
、postgresql
等,并驱动
DBAPI 的名称,例如psycopg2
、pyodbc
、cx_oracle
等。或者,URL 可以是URL
的实例。**kwargs
采用多种选项,这些选项被路由到相应的组件。参数可能特定于Engine
、底层Dialect
、 以及池
。特定方言还接受该方言独有的关键字参数。在这里,我们描述了大多数create_engine()
用法通用的参数。
建立连接后,新生成的Engine
将从底层Pool
请求一次连接 调用Engine.connect()
或调用依赖于它的方法,例如Engine.execute()。
这 收到此请求时,池
将反过来建立第一个实际的 DBAPI 连接。create_engine()
调用本身不会 直接建立任何实际的 DBAPI 连接。
参数
connect_args¶——一个选项字典,将作为额外的关键字参数直接传递给 DBAPI 的connect()
方法。请参阅自定义 DBAPI connect() 参数/连接例程中的示例。
创建者¶ –
返回 DBAPI 连接的可调用对象。此创建函数将传递给底层连接池,并将用于创建所有新的数据库连接。使用此函数会导致绕过 URL 参数中指定的连接参数。
这个钩子不如新钩子灵活DialectEvents.do_connect()
钩子,它允许完全控制如何连接到数据库,事先给定完整的 URL 参数和状态集。echo=False¶ –
如果为 True,则 Engine 会将所有语句及其参数列表的repr()
记录到默认日志处理程序中,该处理程序默认为sys.stdout
输出。如果设置为字符串“debug”
,则结果行也将打印到标准输出中。可以随时修改Engine
的echo
属性以打开和关闭日志记录;也可以使用标准 Python日志记录
模块直接控制日志记录。
另请参阅
配置日志记录 - 有关如何配置日志记录的更多详细信息。
echo_pool=假¶ –
如果为 True,则连接池将记录信息输出,例如连接何时失效以及何时将连接回收到默认日志处理程序,该处理程序默认为sys.stdout
作为输出。 如果设置为字符串“debug”
,则日志记录将包括池签出和签入。 也可以使用标准 Python 直接控制日志记录logging
模块。
另请参阅
配置日志记录 - 有关如何配置日志记录的更多详细信息。empty_in_strategy¶ –
不再使用;SQLAlchemy 现在在所有情况下都对 IN 使用“空集”行为。
1.4 版后已移除: 该create_engine.empty_in_strategy
关键字已弃用,不再具有任何效果。现在,所有 IN 表达式都使用“扩展参数”策略呈现,该策略在语句执行时呈现一组 boundexpressions,或“空集”SELECT。enable_from_linting¶ –
默认为 True。如果发现给定的 SELECT 语句具有未链接的 FROM 元素,这将导致笛卡尔积,则发出警告。
在 1.4 版本加入.
execution_options¶ – 字典执行选项,它将 应用于所有连接。 看Connection.execution_options()
未来¶ –
从 SQLAlchemy 2.0 开始,此参数仅用于向后兼容,并且必须保持其默认值True
。create_engine.future
参数将在后续的 2.x 版本中弃用,并最终被删除。
在 1.4 版本加入.
在 2.0 版更改: 所有Engine
对象都是 “future” 样式的引擎,并且不再有future=False
作模式。hide_parameters¶ –
Boolean,当设置为 True 时,SQL 语句参数将不会显示在 INFO 日志记录中,也不会被格式化为StatementError
对象的字符串表示形式。
在 1.3.8 版本加入.
另请参阅
配置日志记录 - 有关如何配置日志记录的更多详细信息。
implicit_returning=True¶ – 只能设置的遗留参数 设置为 True。在 SQLAlchemy 2.0 中,此参数不执行任何作。为了 对 ORM 调用的语句禁用 “implicit returning”, 使用Table.implicit_returning
参数。insertmanyvalues_page_size¶ –
要格式化为 INSERT 语句,当语句使用 “insertmanyvalues” 模式时,即 批量插入的分页形式,在使用 executemany 执行通常与 RETURNING 结合使用。默认为 1000,但也可能受特定于方言的限制因素的影响,这些限制因素可能会在每个语句的基础上覆盖此值。
2.0 版的新Function。isolation_level¶ –
隔离级别的可选字符串名称 这将无条件地在所有新连接上设置。 隔离级别通常是字符串名称的某个子集“可序列化”、“
可重复读取”
、“READ COMMITTED”、“
READ UNCOMMITTED”
和“AUTOCOMMIT”
基于 backend 的create_engine.isolation_level
参数为 与Connection.execution_options.isolation_level
执行选项,该选项可以在单个Connection
以及传递给Engine.execution_options()
中,它可用于创建具有不同隔离级别的多个引擎,这些引擎共享一个公共连接池和方言。
在 2.0 版更改: 这create_engine.isolation_level
参数已推广到适用于所有支持 隔离级别的概念,并作为更简洁的 与执行选项相反的 up front configuration switch 这更像是一个临时的编程选项。json_deserializer¶ –
对于支持JSON
格式 datatype 中,这是一个 Python 可调用对象,它将转换 JSON 字符串 转换为 Python 对象。 默认情况下,使用 Pythonjson.loads
函数。
在 1.3.7 版本发生变更: SQLite 方言将此_json_deserializer
。json_serializer¶ –
对于支持JSON
的方言 datatype 中,这是一个 Python 可调用对象,它将呈现给定的对象 作为 JSON。 默认情况下,使用 Pythonjson.dumps
函数。
在 1.3.7 版本发生变更: SQLite 方言将此_json_serializer
。
label_length=无¶ –
可选的 Integer 值,用于将动态生成的列标签的大小限制为该数量的字符。如果小于 6,则标签将生成为 “_(counter)”。如果为 None
,则dialect.max_identifier_length
的create_engine.max_identifier_length
参数 。 的值create_engine.label_length
不得大于create_engine.max_identfier_length
。logging_name¶ –
字符串标识符,将在 “sqlalchemy.engine” 记录器中生成的日志记录的 “name” 字段中使用。默认为对象 id 的十六进制字符串。max_identifier_length¶ –
整数;覆盖由 dialect 确定的 max_identifier_length。如果为 None
或 0,则无效。这是数据库配置的最大字符数,可用于 SQL 标识符,例如表名、列名或标签名。所有方言都会自动确定此值,但是,如果新的数据库版本已更改此值,但 SQLAlchemy 的方言尚未调整,则可以在此处传递该值。
在 1.3.9 版本加入.
max_overflow=10¶ – 连接池 “overflow” 中允许的连接数,即可以在pool_size设置之上打开的连接,默认为 5。这仅用于QueuePool
。
module=None¶—— 对 Python 模块对象的引用(模块本身,不是它的字符串名称)。指定引擎的方言要使用的备用 DBAPI 模块。每个子方言都引用一个特定的 DBAPI,该 DBAPI 将在首次连接之前导入。此参数会导致绕过导入,并使用给定的模块。可用于测试 DBAPI 以及将“模拟”DBAPI 实现注入引擎
。
paramstyle=None¶– paramstyle 在渲染绑定参数时使用。 此样式默认为 一个由 DBAPI 本身推荐的,可从.paramstyle
属性。 但是,大多数 DBAPI 都接受 多个 paramstyle,特别是它可能是可取的 将 “named” 参数样式更改为 “positional” 参数样式,反之亦然。 传递此属性时,它应该是“qmark”、“
numeric”、“
named”、“
format”
或“pyformat”
,并且应该对应于正在使用的 DBAPI 已知的支持参数样式。
pool=None¶—— 一个已经构建的池
,例如QueuePool
实例。如果为非 None,则此池将直接用作引擎的底层连接池,绕过 URL 参数中存在的任何连接参数。有关手动构建连接池的信息,请参阅连接池。
poolclass=None¶ –一个 Pool
子类,该类将用于创建连接池 实例。注意 这与pool
的不同之处在于,在这种情况下,您实际上并不实例化 pool,您只是指示要使用的 pool 类型。pool_logging_name¶ –
字符串标识符,将在 “sqlalchemy.pool” 记录器中生成的日志记录的 “name” 字段中使用。默认为对象 id 的十六进制字符串。
另请参阅
配置日志记录 - 有关如何配置日志记录的更多详细信息。pool_pre_ping¶ –
boolean,如果为 True,则启用连接池 “pre-ping” 功能,在每次签出时测试连接的活跃度。
在 1.2 版本加入.
另请参阅
pool_size=5¶ – 保持打开状态的连接数 在连接池内。这与QueuePool
以及SingletonThreadPool 的 QueuePool
进行匹配。 跟QueuePool,pool_size
设置为 0表示没有限制;要禁用池化,请将
poolClass
设置为NullPool 的 NullPool
进行转换。pool_recycle=-1¶ –
此设置会导致池在给定的秒数过后回收连接。它默认为 -1 或无超时。例如,设置为 3600 表示连接将在一小时后回收。请注意,如果 8 小时内在连接上未检测到任何活动,则 MySQL 将自动断开连接(尽管这可以通过 MySQLDB 连接本身和服务器配置进行配置)。
另请参阅
pool_reset_on_return='回滚'¶ –
将Pool.reset_on_return
个参数Pool
对象,该对象可设置为值“rollback”、“
commit”
或None
。
另请参阅pool_timeout=30¶ –
在放弃从池中获取连接之前等待的秒数。这仅用于QueuePool
。这可以是浮点数,但受 Python 时间函数的限制,在几十毫秒内可能不可靠。
pool_use_lifo=假¶ –
从QueuePool
检索连接时使用 LIFO (后进先出) 而不是 FIFO (先进先出)。使用 LIFO,服务器端超时方案可以减少非高峰使用期间使用的连接数。在规划服务器端超时时,请确保使用回收或 pre-ping 策略来正常处理过时的连接。
在 1.3 版本加入.
插件¶–
要加载的插件名称的 string 列表。 看CreateEnginePlugin
作为背景。
在 1.2.3 版本加入.query_cache_size¶ –
用于缓存 SQL 字符串形式的查询的缓存大小。设置为 0 可禁用缓存。
当缓存的大小达到 N * 1.5 时,缓存将修剪最近最少使用的项目。默认为 500,这意味着缓存在填充时将始终存储至少 500 个 SQL 语句,并且将增长到 750 个项目,此时通过删除 250 个最近最少使用的项目,将其修剪回 500 个。
缓存是在每个语句的基础上完成的,方法是生成一个表示语句结构的缓存键,然后仅当缓存中不存在该键时才为当前方言生成字符串 SQL。所有语句都支持缓存,但某些功能(例如具有大量参数的 INSERT)会有意绕过缓存。SQL 日志记录将指示每个语句的统计信息,无论它是否是从缓存中提取的。
注意
一些与工作单元持久性相关的 ORM 函数以及一些属性加载策略将使用主缓存之外的单个每个映射器缓存。
另请参阅
在 1.4 版本加入.use_insertmanyvalues¶ –
默认情况下为 True,则对 INSERT.. 使用 “insertmanyvalues” 执行样式。RETURNING 语句。
2.0 版的新Function。
-
函数 sqlalchemy.engine_from_config(configuration: Dict[str, Any], prefix: str = 'sqlalchemy.', **kwargs: Any)引擎 ¶
使用配置字典创建新的 Engine 实例。
字典通常是从配置文件生成的。engine_from_config()
感兴趣的键应该带有前缀,例如sqlalchemy.url
、sqlalchemy.echo
等。'prefix' 参数指示要搜索的前缀。每个匹配的键(在去除前缀后)都被视为create_engine()
调用的相应关键字参数。
唯一需要的键是(假设默认前缀)sqlalchemy.url
,它提供数据库 URL。
一组选定的关键字参数将根据字符串值被“强制”为其预期类型。参数集可以使用engine_config_types
访问器按方言进行扩展。
参数
configuration¶– 一个字典(通常由配置文件生成, 但这不是要求)。 键以值 of 'prefix' 将去除该前缀,然后传递给create_engine()
中。
prefix¶– 要匹配的前缀,然后从 'configuration' 中的 key 中去除。
kwargs¶–engine_from_config()
本身的每个关键字参数都会覆盖从 'configuration' 字典中获取的相应项目。关键字参数不应带有前缀。
-
函数 sqlalchemy.create_mock_engine(url:strURL, executor: Any, **kw: Any)MockConnection ¶
创建一个用于回显 DDL 的 “mock” 引擎。
这是一个实用函数,用于调试或存储由MetaData.create_all()
生成的 DDL 序列的输出 和相关方法。
该函数接受一个仅用于确定要使用的方言类型的 URL,以及一个“executor”可调用函数,该函数将接收 SQL 表达式对象和参数,然后可以回显或以其他方式打印。执行程序的返回值不会被处理,引擎也不允许调用常规字符串语句,因此仅对发送到数据库而没有收到任何结果的 DDL 有用。
例如:from sqlalchemy import create_mock_engine def dump(sql, *multiparams, **params): print(sql.compile(dialect=engine.dialect)) engine = create_mock_engine("postgresql+psycopg2://", dump) metadata.create_all(engine, checkfirst=False)
参数
url¶– 一个字符串 URL,通常只需要包含数据库后端名称。
executor¶—— 接收参数sql
、multiparams
和**params
.sql
参数通常是ExecutableDDLElement
的实例,然后可以使用ExecutableDDLElement.compile()
.
1.4 版本的新功能: -create_mock_engine()
函数替换了 之前的 “mock” 引擎策略与create_engine()
中。
-
函数 sqlalchemy.engine。make_url(name_or_url:strURL)URL ¶
给定一个字符串,生成一个新的 URL 实例。
URL 的格式通常遵循 RFC-1738,但有一些例外,包括在“方案”部分接受下划线,而不是破折号或句点。
如果传递了URL
对象,则按原样返回该对象。
另请参阅
-
函数 sqlalchemy.create_pool_from_url(url:strURL, **kwargs: Any)矿池 ¶
从给定的 URL 创建池实例。
如果未提供poolclass
,则使用 URL 中指定的方言选择使用的池类。
传递给create_pool_from_url()
的参数与传递给create_engine()
的 pool 参数相同 功能。
在 2.0.10 版本加入.
-
类 sqlalchemy.engine 中。网址¶
表示用于连接到数据库的 URL 的组件。
URL 通常由完全格式化的 URL 字符串构成,其中make_url()
函数由create_engine()
函数将 URL 字符串解析为 它的各个组件,然后用于构建一个新的URL
对象。从格式化的 URL 字符串进行解析时,解析 格式通常遵循 RFC-1738,但有一些例外。
URL对象也可以直接生成,方法是使用
make_url()
函数和完全格式的 URL 字符串,或者通过使用URL.create()
构造函数来构造以编程方式给定的单个字段的URL
。生成的URL
对象可以直接传递给create_engine()
代替字符串参数,这将绕过引擎创建过程中make_url()
的使用。
在 1.4 版本发生变更:URL
对象现在是不可变对象。要创建 URL,请使用make_url()
或URL.create()
函数/方法。要修改URL
,请使用URL.set()
和URL.update_query_dict()
返回一个新的URL
对象。有关此更改的说明,请参阅 URL 对象现在是不可变的。
另请参阅URL
包含以下属性:URL.drivername
:数据库后端和驱动程序名称,例如PostgreSQL + 灵能 2
URL.username
:用户名字符串URL.password
: 密码字符串URL.host
:字符串主机名URL.port
:整数端口号URL.database
:字符串数据库名称URL.query
:表示查询字符串的不可变映射。包含键的字符串和值的字符串或字符串元组。
成员
create(), 数据库, difference_update_query(), drivername, get_backend_name(), get_dialect(), get_driver_name(), host, normalized_query, password, port, query, render_as_string(), set()、translate_connect_args()、update_query_dict()、update_query_pairs()、update_query_string()、用户名
类签名
类sqlalchemy.engine.URL
(builtins.tuple
)-
类方法sqlalchemy.engine.URL 中。
create(drivername: str, username:strNone=None, password:strNone=None, host:strNone=None, port:intNone=None, database:strNone=None, query:Mapping[str,Sequence[str]str]={})URL ¶
创建新的URL
对象。
另请参阅
参数
drivername¶ – 数据库后端的名称。此名称将对应于 sqlalchemy/databases 中的模块或第三方插件。
username¶- 用户名。
密码¶ –
数据库密码。通常是一个字符串,但也可能是可以用str()
字符串化的对象。
注意
当作为参数传递给URL.create()
时,密码字符串不应进行 URL 编码;该字符串应包含与键入的密码字符完全相同的密码字符。
注意
生成密码的对象将仅被字符串化 每个Engine
对象一次。有关每个连接的动态密码生成,请参阅生成动态身份验证令牌。
host¶– 主机的名称。
port¶— 端口号。
database¶– 数据库名称。
query¶– 字符串键到要传递的字符串值的字典 连接到方言和/或 DBAPI。 指定非字符串 参数直接添加到 Python DBAPI 中,请使用create_engine.connect_args
参数设置为create_engine()
中。 另请参阅URL.normalized_query
对于始终为 string-->list of string 的字典。
结果
newURL
对象。
1.4 版本中的新功能:URL
对象现在是名为 元组。此外,查询
字典也是不可变的。要创建 URL,请使用make_url()
或URL.create()
函数/方法。 要修改URL
中,使用URL.set()
和URL.update_query()
方法。
-
属性sqlalchemy.engine.URL 的 URL 中。
database:strNone¶
数据库名称
-
方法sqlalchemy.engine.URL 中。
difference_update_query(names: Iterable[str])URL ¶
从URL.query
字典中删除给定的名称,返回新的URL
。
例如:url = url.difference_update_query(["foo", "bar"])
等效于使用URL.set(),
如下所示:url = url.set( query={ key: url.query[key] for key in set(url.query).difference(["foo", "bar"]) } )
在 1.4 版本加入.
-
属性sqlalchemy.engine.URL 的 URL 中。
drivername: str(驱动程序名称:str)¶
数据库后端和驱动程序名称,例如PostgreSQL + 灵能 2
-
方法sqlalchemy.engine.URL 中。
get_backend_name()str ¶
返回后端名称。
这是与正在使用的数据库后端相对应的名称,并且是URL.drivername
的一部分 即加号的左侧。
-
方法sqlalchemy.engine.URL 中。
get_dialect(_is_async: bool = false)类型[方言] ¶
返回与此 URL 的驱动程序名称对应的 SQLAlchemyDialect
类。
-
方法sqlalchemy.engine.URL 中。
get_driver_name()str ¶
返回后端名称。
这是与正在使用的 DBAPI 驱动程序对应的名称,是URL.drivername
的一部分 即加号的右侧。
如果URL.drivername
不包含加号,则此URL
的默认方言
以获取驱动程序名称。
-
属性sqlalchemy.engine.URL 的 URL 中。
host:strNone¶
主机名或 IP 号。也可能是某些驱动程序的数据源名称。
-
属性sqlalchemy.engine.URL 的 URL 中。
normalized_query¶
返回URL.query
字典,其值规范化为序列。
由于URL.query
字典可能包含字符串值或字符串值序列,以区分在查询字符串中多次指定的参数,因此需要通常处理多个参数的代码将希望使用此属性,以便存在的所有参数都显示为序列。灵感来自 Python 的urllib.parse.parse_qs
功能。 例如:>>> from sqlalchemy.engine import make_url >>> url = make_url( ... "postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt" ... ) >>> url.query immutabledict({'alt_host': ('host1', 'host2'), 'ssl_cipher': '/path/to/crt'}) >>> url.normalized_query immutabledict({'alt_host': ('host1', 'host2'), 'ssl_cipher': ('/path/to/crt',)})
-
属性sqlalchemy.engine.URL 的 URL 中。
password:strNone¶
password,它通常是一个字符串,但也可以是具有__str__()
方法的任何对象。
-
属性sqlalchemy.engine.URL 的 URL 中。
port:intNone¶
整数端口号
-
属性sqlalchemy.engine.URL 的 URL 中。
查询:immutabledict[str,Tuple[str,...]str]¶
表示查询字符串的不可变映射。包含键的字符串和值的字符串或字符串元组,例如:>>> from sqlalchemy.engine import make_url >>> url = make_url( ... "postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt" ... ) >>> url.query immutabledict({'alt_host': ('host1', 'host2'), 'ssl_cipher': '/path/to/crt'}) To create a mutable copy of this mapping, use the ``dict`` constructor:: mutable_query_opts = dict(url.query)
-
方法sqlalchemy.engine.URL 中。
render_as_string(hide_password: bool = True)str ¶
将此URL
对象呈现为字符串。
当__str__()
或__repr__()
时,使用此方法 方法。 该方法直接包含其他选项。
参数
hide_password¶ – 默认为 True。除非将其设置为 False,否则密码不会显示在字符串中。
-
方法sqlalchemy.engine.URL 中。
set(drivername:strNone=无, username:strNone=无, password:strNone=无, host:strNone=无, port:intNone=无, database:strNone=无, query:Mapping[str,Sequence[str]str]None=无)URL ¶
返回一个经过修改的新URL
对象。
如果值为非 None,则使用它们。将值设置为None
显式地使用改编自NamedTuple
的URL._replace()
方法。
参数
结果
newURL
对象。
在 1.4 版本加入.
-
方法sqlalchemy.engine.URL 中。
translate_connect_args(names:List[str]None=None, **kw: Any)Dict[str, Any] ¶
将 url 属性转换为连接参数字典。
返回此 url 的属性(host、database、username、 password, port) 作为普通字典。默认情况下,属性名称用作键。unset 或 false 属性在最终字典中被省略。
-
方法sqlalchemy.engine.URL 中。
update_query_dict(query_parameters:Mapping[str,strList[str]], append: bool = False)URL ¶
返回一个新的URL
对象,其中包含URL.query
参数字典。
字典通常包含字符串键和字符串值。为了表示多次表达的查询参数,请传递一系列字符串值。
例如:>>> from sqlalchemy.engine import make_url >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname") >>> url = url.update_query_dict( ... {"alt_host": ["host1", "host2"], "ssl_cipher": "/path/to/crt"} ... ) >>> str(url) 'postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt'
参数
在 1.4 版本加入.
-
方法sqlalchemy.engine.URL 中。
update_query_pairs(key_value_pairs:Iterable[Tuple[str,strList[str]]], append: bool = False)URL ¶
返回一个新的URL
对象,其中包含URL.query
查询 由给定的键/值对序列更新的参数字典
例如:>>> from sqlalchemy.engine import make_url >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname") >>> url = url.update_query_pairs( ... [ ... ("alt_host", "host1"), ... ("alt_host", "host2"), ... ("ssl_cipher", "/path/to/crt"), ... ] ... ) >>> str(url) 'postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt'
参数
在 1.4 版本加入.
-
方法sqlalchemy.engine.URL 中。
update_query_string(query_string: str, append: bool = False)网址 ¶
返回带有URL.query
的新URL
对象 由给定查询字符串更新的 parameter dictionary。
例如:>>> from sqlalchemy.engine import make_url >>> url = make_url("postgresql+psycopg2://user:pass@host/dbname") >>> url = url.update_query_string( ... "alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt" ... ) >>> str(url) 'postgresql+psycopg2://user:pass@host/dbname?alt_host=host1&alt_host=host2&ssl_cipher=%2Fpath%2Fto%2Fcrt'
参数
在 1.4 版本加入.
-
属性sqlalchemy.engine.URL 的 URL 中。
username:strNone¶
用户名字符串
矿池化¶
当调用 connect()
或 execute()
方法时,Engine
将向连接池请求连接。默认连接池 QueuePool
将打开与
数据库。执行并发语句时,
QueuePool
会将其连接池增加到
默认大小为 5,并允许默认的 “overflow” 为 10。由于
Engine
本质上是
连接池,因此您应该保留一个
Engine
,而不是为每个连接创建一个新数据库。
注意
默认情况下,QueuePool
不用于 SQLite 引擎。 看
SQLite 了解有关 SQLite 连接池使用情况的详细信息。
有关连接池的更多信息,请参阅连接池。
自定义 DBAPI connect() 参数 / 连接例程¶
对于需要特殊连接方法的情况,在绝大多数情况下
的情况下,在
create_engine()
级别来自定义此过程。这些将在以下小节中介绍。
传递给 dbapi.connect() 的特殊关键字参数¶
所有 Python DBAPI 都接受除基本连接之外的其他参数。常用参数包括用于指定字符集编码和超时值的参数;更复杂的数据包括特殊的 DBAPI 常量和对象以及 SSL 子参数。有两种基本方法可以传递这些参数而不复杂。
向 URL 查询字符串添加参数¶
简单的字符串值,以及一些数值和布尔标志,通常可以直接在 URL 的查询字符串中指定。一个常见的示例是接受字符编码的参数编码
的 DBAPI,例如大多数 MySQL DBAPI:
engine = create_engine("mysql+pymysql://user:pass@host/test?charset=utf8mb4")
使用查询字符串的优点是,可以在配置文件中以可移植到 URL 中指定的 DBAPI 的方式指定其他 DBAPI 选项。在此级别传递的具体参数因 SQLAlchemy 方言而异。一些 dialect 将所有参数作为字符串传递,而另一些 dialect 将解析特定数据类型并将参数移动到不同位置,例如驱动程序级 DSN 和连接字符串。由于此区域中每种方言的行为当前各不相同,因此应查阅方言文档以了解正在使用的特定方言,以查看此级别是否支持特定参数。
提示
使用 Dialect.create_connect_args()
来显示传递给给定 URL 的 DBAPI 的确切参数的通用技术
方法直接如下:
>>> from sqlalchemy import create_engine
>>> engine = create_engine(
... "mysql+pymysql://some_user:some_pass@some_host/test?charset=utf8mb4"
... )
>>> args, kwargs = engine.dialect.create_connect_args(engine.url)
>>> args, kwargs
([], {'host': 'some_host', 'database': 'test', 'user': 'some_user', 'password': 'some_pass', 'charset': 'utf8mb4', 'client_flag': 2})
上述 args、kwargs
对通常作为
dbapi.connect(*args, **kwargs)
.
使用 connect_args dictionary 参数¶
将任何参数传递给 dbapi.connect()
的更通用系统
保证始终传递所有参数的函数是
create_engine.connect_args
字典参数。这可用于在添加到查询字符串时方言不处理的参数,以及必须将特殊子结构或对象传递给 DBAPI 时。有时,只是必须将特定标志作为 True
符号发送,而 SQLAlchemy 方言不知道此关键字参数以强制其从 URL 中显示的字符串形式中发出。下面说明了 psycopg2 “连接工厂” 的使用,它替换了 connection 的底层实现:
engine = create_engine(
"postgresql+psycopg2://user:pass@hostname/dbname",
connect_args={"connection_factory": MyConnectionFactory},
)
另一个示例是 pyodbc “timeout” 参数:
engine = create_engine(
"mssql+pyodbc://user:pass@sqlsrvr?driver=ODBC+Driver+13+for+SQL+Server",
connect_args={"timeout": 30},
)
上面的示例还说明了 URL“查询字符串”参数以及 create_engine.connect_args
可以同时使用;对于 PyODBC,“driver” 关键字在 URL 中具有特殊含义。
控制如何将参数传递给 DBAPI connect() 函数¶
除了作传递给 connect()
的参数之外,我们还可以使用
DialectEvents.do_connect()
事件钩子。这个钩子将完整的
*args, **kwargs
,方言将发送到 connect()。
然后,可以就地修改这些集合以更改它们的使用方式:
from sqlalchemy import event
engine = create_engine("postgresql+psycopg2://user:pass@hostname/dbname")
@event.listens_for(engine, "do_connect")
def receive_do_connect(dialect, conn_rec, cargs, cparams):
cparams["connection_factory"] = MyConnectionFactory
生成动态身份验证令牌¶
DialectEvents.do_connect()
也是动态
插入一个身份验证令牌,该令牌可能会在
发动机
。例如,如果令牌由
get_authentication_token()
并在令牌
中传递给 DBAPI
参数,这可以实现为:
from sqlalchemy import event
engine = create_engine("postgresql+psycopg2://user@hostname/dbname")
@event.listens_for(engine, "do_connect")
def provide_token(dialect, conn_rec, cargs, cparams):
cparams["token"] = get_authentication_token()
另请参阅
使用访问令牌连接到数据库 - 涉及 SQL Server 的更具体示例
连接后修改 DBAPI 连接,或在连接后运行命令¶
对于 SQLAlchemy 创建的 DBAPI 连接没有问题,但是我们
想在实际使用之前修改已完成的连接,例如
至于设置特殊标志或运行某些命令,
PoolEvents.connect()
事件钩子是最合适的钩子。在 SQLAlchemy 使用之前,每个创建的新连接都会调用此钩子:
from sqlalchemy import event
engine = create_engine("postgresql+psycopg2://user:pass@hostname/dbname")
@event.listens_for(engine, "connect")
def connect(dbapi_connection, connection_record):
cursor_obj = dbapi_connection.cursor()
cursor_obj.execute("SET some session variables")
cursor_obj.close()
完全替换 DBAPI connect()
函数¶
最后,DialectEvents.do_connect()
事件钩子还可以允许我们通过建立连接并返回它来完全接管连接过程:
from sqlalchemy import event
engine = create_engine("postgresql+psycopg2://user:pass@hostname/dbname")
@event.listens_for(engine, "do_connect")
def receive_do_connect(dialect, conn_rec, cargs, cparams):
# return the new DBAPI connection with whatever we'd like to
# do
return psycopg2.connect(*cargs, **cparams)
DialectEvents.do_connect()
钩子取代了之前的
create_engine.creator
钩子,该钩子仍然可用。
DialectEvents.do_connect()
具有明显的优势,即从 URL 解析的完整参数也会传递给用户定义的函数,而 create_engine.creator
则不是这种情况。
配置日志¶
Python 的标准日志记录模块用于
使用 SQLAlchemy 实现信息和调试日志输出。这允许
SQLAlchemy 的日志记录,以标准方式与其他应用程序集成
和图书馆。 还有两个参数
create_engine.echo
和 create_engine.echo_pool
存在于 create_engine()
上,允许立即记录到 sys.stdout
为了地方发展;这些参数最终会相互作用
替换为下面描述的常规 Python 记录器。
本节假定您熟悉上述链接的日志记录模块。SQLAlchemy 执行的所有日志记录都存在于 sqlalchemy
下
namespace 中,如 logging.getLogger('sqlalchemy')
.配置日志记录后(例如通过 logging.basicConfig()
),可以打开的 SA logger 的通用命名空间如下:
sqlalchemy.engine
- 控制 SQL 回显。对于 SQL查询输出、日志记录,设置为
logging.INFO。DEBUG
用于查询 + 结果集输出。这些设置等效于echo=True
和echo=“debug”
oncreate_engine.echo
中。sqlalchemy.pool
- 控制连接池日志记录。 设置为logging.INFO
记录连接失效和回收事件;设置为伐木。DEBUG
来额外记录所有池签入和签出。这些设置等效于pool_echo=True
和pool_echo=“debug”
分别在create_engine.echo_pool
上。sqlalchemy.dialects
- 控制 SQL 方言的自定义日志记录,只要在特定方言中使用日志记录,这通常是最小的。sqlalchemy.orm
- 在一定程度上控制各种 ORM 函数的日志记录 该日志记录在 ORM 中使用,这通常是最小的。 设置为logging.INFO
记录有关 mapper 配置的一些顶级信息。
例如,要使用 Python 日志记录而不是
echo=True
标志:
import logging
logging.basicConfig()
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
默认情况下,日志级别设置为 logging。WARN
中
sqlalchemy
命名空间,这样就不会发生日志作,即使在启用了日志记录的应用程序中也是如此。
注意
SQLAlchemy 引擎
仅在检测到当前日志记录级别为 logging.INFO
或 logging时发出 log 语句,从而节省 Python 函数调用开销。DEBUG的 DEBUG
中。它仅在从连接池中获取新连接时检查此级别。因此,在更改已运行的应用程序的日志记录配置时,当前处于活动状态的任何 Connection
或更常见的
Session
对象在事务中处于活动状态,则不会
根据新配置记录任何 SQL,直到新的
已购买连接
(在
Session
,这是在当前事务结束并且新事务开始之后)。
更多关于 Echo 标志¶
如前所述,create_engine.echo
和 create_engine.echo_pool
parameters 是立即记录到 sys.stdout
的快捷方式:
>>> from sqlalchemy import create_engine, text
>>> e = create_engine("sqlite://", echo=True, echo_pool="debug")
>>> with e.connect() as conn:
... print(conn.scalar(text("select 'hi'")))
2020-10-24 12:54:57,701 DEBUG sqlalchemy.pool.impl.SingletonThreadPool Created new connection <sqlite3.Connection object at 0x7f287819ac60>
2020-10-24 12:54:57,701 DEBUG sqlalchemy.pool.impl.SingletonThreadPool Connection <sqlite3.Connection object at 0x7f287819ac60> checked out from pool
2020-10-24 12:54:57,702 INFO sqlalchemy.engine.Engine select 'hi'
2020-10-24 12:54:57,702 INFO sqlalchemy.engine.Engine ()
hi
2020-10-24 12:54:57,703 DEBUG sqlalchemy.pool.impl.SingletonThreadPool Connection <sqlite3.Connection object at 0x7f287819ac60> being returned to pool
2020-10-24 12:54:57,704 DEBUG sqlalchemy.pool.impl.SingletonThreadPool Connection <sqlite3.Connection object at 0x7f287819ac60> rollback-on-return
使用这些标志大致相当于:
import logging
logging.basicConfig()
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
logging.getLogger("sqlalchemy.pool").setLevel(logging.DEBUG)
需要注意的是,这两个标志独立于任何现有的日志记录配置工作,并且将使用 logging.basicConfig()
絕對。 除了任何现有的 Logger 配置之外,它还具有配置的效果。因此,在配置日志记录时
显式地,确保所有 echo 标志始终设置为 False,以避免获得重复的日志行。
设置日志名称¶
实例的记录器名称,例如 Engine
或
Pool
默认使用截断的十六进制标识符
字符串。要将其设置为特定名称,请使用
create_engine.logging_name
和
create_engine.pool_logging_name
跟
sqlalchemy.create_engine()
;该名称将附加到日志记录名称中
sqlalchemy.engine.Engine
的
>>> import logging
>>> from sqlalchemy import create_engine
>>> from sqlalchemy import text
>>> logging.basicConfig()
>>> logging.getLogger("sqlalchemy.engine.Engine.myengine").setLevel(logging.INFO)
>>> e = create_engine("sqlite://", logging_name="myengine")
>>> with e.connect() as conn:
... conn.execute(text("select 'hi'"))
2020-10-24 12:47:04,291 INFO sqlalchemy.engine.Engine.myengine select 'hi'
2020-10-24 12:47:04,292 INFO sqlalchemy.engine.Engine.myengine ()
提示
create_engine.logging_name
和
create_engine.pool_logging_name
parameters 也可以与 create_engine.echo
和
create_engine.echo_pool
中。但是,如果创建其他引擎时将 echo 标志设置为 True 且没有日志记录名称,则会出现不可避免的双重日志记录情况。这是因为将自动为 sqlalchemy.engine.Engine
添加一个处理程序,该处理程序将记录无名称引擎以及具有日志记录名称的引擎的消息。例如:
from sqlalchemy import create_engine, text
e1 = create_engine("sqlite://", echo=True, logging_name="myname")
with e1.begin() as conn:
conn.execute(text("SELECT 1"))
e2 = create_engine("sqlite://", echo=True)
with e2.begin() as conn:
conn.execute(text("SELECT 2"))
with e1.begin() as conn:
conn.execute(text("SELECT 3"))
上述情况将重复对数 SELECT 3
。要解决此问题,请确保所有引擎都设置了 logging_name
,或者使用显式 logger / 处理程序设置,而不使用 create_engine.echo
和
create_engine.echo_pool
中。
设置每个连接 / 子引擎令牌¶
1.4.0b2 版本的新Function。
虽然日志记录名称适合在
Engine
对象,则它不够灵活,无法容纳任意大的名称列表,用于跟踪日志消息中的单个连接和/或事务。
对于此使用案例,由
Connection
和 Result
对象可以使用其他标记(如事务或请求标识符)进行扩充。该 Connection.execution_options.logging_token
参数接受一个字符串参数,该参数可用于建立每个连接跟踪令牌:
>>> from sqlalchemy import create_engine
>>> e = create_engine("sqlite://", echo="debug")
>>> with e.connect().execution_options(logging_token="track1") as conn:
... conn.execute(text("select 1")).all()
2021-02-03 11:48:45,754 INFO sqlalchemy.engine.Engine [track1] select 1
2021-02-03 11:48:45,754 INFO sqlalchemy.engine.Engine [track1] [raw sql] ()
2021-02-03 11:48:45,754 DEBUG sqlalchemy.engine.Engine [track1] Col ('1',)
2021-02-03 11:48:45,755 DEBUG sqlalchemy.engine.Engine [track1] Row (1,)
参数 Connection.execution_options.logging_token
也可以在 engines 或 sub engines 上通过
create_engine.execution_options
或 Engine.execution_options()
的这对于将不同的日志记录令牌应用于应用程序的不同组件而不创建新引擎可能很有用:
>>> from sqlalchemy import create_engine
>>> e = create_engine("sqlite://", echo="debug")
>>> e1 = e.execution_options(logging_token="track1")
>>> e2 = e.execution_options(logging_token="track2")
>>> with e1.connect() as conn:
... conn.execute(text("select 1")).all()
2021-02-03 11:51:08,960 INFO sqlalchemy.engine.Engine [track1] select 1
2021-02-03 11:51:08,960 INFO sqlalchemy.engine.Engine [track1] [raw sql] ()
2021-02-03 11:51:08,960 DEBUG sqlalchemy.engine.Engine [track1] Col ('1',)
2021-02-03 11:51:08,961 DEBUG sqlalchemy.engine.Engine [track1] Row (1,)
>>> with e2.connect() as conn:
... conn.execute(text("select 2")).all()
2021-02-03 11:52:05,518 INFO sqlalchemy.engine.Engine [track2] Select 1
2021-02-03 11:52:05,519 INFO sqlalchemy.engine.Engine [track2] [raw sql] ()
2021-02-03 11:52:05,520 DEBUG sqlalchemy.engine.Engine [track2] Col ('1',)
2021-02-03 11:52:05,520 DEBUG sqlalchemy.engine.Engine [track2] Row (1,)
隐藏参数¶
Engine
发出的日志记录还指示一段摘录
的特定语句存在的 SQL 参数。 为了防止
这些参数不会出于隐私目的而被记录下来,因此会启用
create_engine.hide_parameters
标志:
>>> e = create_engine("sqlite://", echo=True, hide_parameters=True)
>>> with e.connect() as conn:
... conn.execute(text("select :some_private_name"), {"some_private_name": "pii"})
2020-10-24 12:48:32,808 INFO sqlalchemy.engine.Engine select ?
2020-10-24 12:48:32,808 INFO sqlalchemy.engine.Engine [SQL parameters hidden due to hide_parameters=True]