从sqlalchemy中定义的表中获取创建查询字符串

问题描述 投票:0回答:2

我有一个异步python应用程序,它的数据库使用asyncpg进行连接,我希望避免手动键入每个查询。我发现sqlalchemy core对此非常有帮助,但是我为一件事而苦恼。我希望我的应用程序能够在启动时创建数据库模式,而不是依靠已经创建的数据库模式,而且我还没有找到一种自动的方式。我想要的是类似的东西:

import asyncio

from sqlalchemy import Table, Column, Integer, String, MetaData
import asyncpg

metadata = MetaData()

people = Table(
    "people",
    metadata,
    Column("id", Integer, primary_key=True, autoincrement=True),
    Column("name", String)
)

class Database:
    def __init__(self, pool: asyncpg.pool.Pool):
        self.pool = pool

    async def ensure_schema(self):
        async with self.pool.acquire() as con:
            await con.execute(
                # this method doesn't really exist,
                # I'm just looking for something that would 
                # do the same - return following query:
                # CREATE TABLE IF NOT EXISTS people(id INTEGER PRIMARY KEY, name VARCHAR)
                people.get_create_query(checkfirst=True)
            )

async def main()
    pool = await asyncpg.create_pool(host="127.0.0.1", port=5432, user="postgres", password="postgres", database="test")
    db = Database(pool)
    await db.ensure_schema()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

这里的问题是,sqlalchemy期望metadata绑定到引擎,但是它不支持异步引擎。因此,我只想从已声明的表中获取CREATE查询字符串,并将其传递给我的连接以执行。

对此的类比可能是people.select(),它不会立即执行,它只是创建一个对象,该对象也具有要执行的查询的字符串表示形式。

我可以将sql模式存储在一个单独的文件中,并在启动时加载它,但是感觉并不像对模式的每次更改一样,我需要在代码的两个位置进行更改。有什么建议吗?

sqlalchemy python-3.7 asyncpg
2个回答
0
投票

SQLAlchemy使用]创建表>

self.Base.metadata.create_all(engine, tables=[people.__table__])

0
投票

实现sqlalchemy可以打印出设置create_engine("connection-string", echo=True)时执行的所有语句,并且在创建新表人员时将其打印出

© www.soinside.com 2019 - 2024. All rights reserved.