不同数据库后端的peewee数据库的运行时初始化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不同数据库后端的peewee数据库的运行时初始化相关的知识,希望对你有一定的参考价值。

我正在尝试编写一个(有些)数据库独立的模块。我想定义我的peewee模型,然后在运行时使用数据库对象的init方法连接到数据库。

当我传递一个Sqlite连接字符串时,它按预期工作,例如

>>> app.db.init('sqlite://mydb.sqlite')

连接到数据库,一切都按预期工作。但是当我用postgres连接字符串尝试相同时,我得到一个错误;

>>> app.db.init('postgresql://username:password@localhost/mydb')
...
peewee.OperationalError: FATAL:  database "postgresql://username:password@localhost/mydb" does not exist 

如果我使用单独的参数,我可以得到init方法连接;

>>> app.db.init('mydb', username='username', password='password')

但是这在不同的数据库后端之间并不能很好地转换。

任何人都可以指出我正确的方向让init使用连接URI吗?

答案

在与Peewee作者进行一些互动后,似乎答案是使用Proxy对象 - http://docs.peewee-orm.com/en/latest/peewee/database.html#dynamically-defining-a-database

在我的模型模块中我做;

database_proxy = pw.Proxy()
...
class Blah(pw.Model):
    column_one = pw.CharField()

    class Meta:
        database = database_proxy

然后在运行时连接我做;

>>> from playhouse.db_url import connect
>>> import models
>>> db = connect('postgresql://username:password@localhost/mydb')
>>> models.database_proxy.initialize(db)

然后我可以正常地与我的模型对象进行交互。这样我就可以在不同的数据库后端之间切换,只需在我的应用程序配置中有一个连接URL字符串即可在它们之间切换。

另一答案

我想我已经找到了办法做到这一点。它有点笨重,所以如果有人有更好的建议,我会全力以赴。我正在创建一个connect对象,然后将它的属性传递给db.init。像这样

>>> from playhouse.db_url import connect
>>> import models
>>> db = connect('postgresql://username:password@localhost/mydb')
>>> models.db.init(db.database, **db.connect_kwargs)

这似乎与任何有效的Peewee后端一起使用。

以上是关于不同数据库后端的peewee数据库的运行时初始化的主要内容,如果未能解决你的问题,请参考以下文章

Flask和peewee FlaskDB()“连接已经打开”与APScheduler

Flask + Peewee:在哪里创建表格?

超时重新连接 MySQL

peewee.OperationalError: no such table

peewee.InterfaceError:保存大量数据时绑定参数错误

Python:用 peewee 框架连接 SQL Server