Polars中多数据库引擎读写PostgreSQL时能否复用含只读参数的连接串?
咱们先把各个引擎的支持情况拆开来唠,再给你说清楚注意事项和替代方案:
各引擎对目标连接串的支持情况
ADBC(读写通用):
这个连接串对ADBC来说是完全兼容的!不管是用pl.read_database_uri(..., engine="adbc")做读取,还是用pl.write_database(..., engine="adbc")做写入——不过这里要敲黑板:写入操作绝对不能用带只读参数的连接串!PostgreSQL的只读事务会直接拒绝INSERT/UPDATE/DELETE这类写操作,会抛出类似“cannot execute INSERT in a read-only transaction”的错误。所以读的时候放心用原串,写的时候你得把串里的?options=-c%20default_transaction_read_only%3DTrue这段删掉,用基础的postgresql://scott:tiger@localhost:5432/mydatabase就行。ConnectorX(仅用于读取):
完全支持!ConnectorX的PostgreSQL驱动基于libpq开发,和ADBC一样能正确解析这种带options参数的标准PostgreSQL连接串。用pl.read_database_uri(..., engine="connectorx")的时候,只读参数会被正常传递,事务会以只读模式运行,直接复用原串没毛病。SQLAlchemy(仅用于写入):
首先还是那个核心问题:写操作不能用只读连接串,这是数据库的硬性限制,和SQLAlchemy无关。就算你硬塞这个串进去,写操作也会失败。另外,就算是用SQLAlchemy做读取(虽然你问题里读用的是另外两个引擎),SQLAlchemy也不推荐直接在URL里塞options参数,更规范的方式是通过connect_args传递,但这对你的场景来说暂时用不上。所以用SQLAlchemy写的时候,直接用不带只读参数的基础连接串就好。
总结&最优替代方案
如果你的读写都用ADBC,那可以准备两个连接串:一个带只读参数用于读,一个不带用于写(其实就是原串删掉后面的参数部分),逻辑简单还能保证引擎兼容。
如果读用ConnectorX、写用ADBC,那读直接复用原串,写用基础串就行。
如果写必须用SQLAlchemy,那只能用基础连接串,而且绝对不能加只读参数——毕竟写操作本身就需要可写的事务。
内容来源于stack exchange

