从 sqlalchemy (Core) 中的表中获取主键列名

Adr*_*nez 1 python sqlalchemy

我正在使用 Sqlalchemy 的核心,所以我没有像在其他类似问题中那样使用声明性基类。如何使用引擎获取表的主键?

gre*_*rgé 5

所以,我遇到了同样的问题。您需要创建一个 Table 对象来反映您要为其查找主键的表。

from sqlalchemy import create_engine, Table, MetaData

dbUrl = 'postgres://localhost:5432/databaseName'   #will be different for different db's

engine = create_engine(dbUrl)
meta = MetaData()

table = Table('tableName', meta, autoload=True, autoload_with=engine)

primaryKeyColName = table.primary_key.columns.values()[0].name
Run Code Online (Sandbox Code Playgroud)

上面的 Table 结构可用于许多不同的功能。我经常使用它来管理地理空间表,因为我不太喜欢现有的任何软件包。

在您的评论中,您提到您没有定义表......我认为这意味着您没有创建表的 sqlalchemy 模型。使用上述方法,您不需要这样做,并且可以以更动态的方式从表中收集各种信息。如果您将他人的杂乱数据库交给您,则特别有用!

希望有帮助。


小智 5

我想发表评论,但我没有足够的声誉。

基于greenbergé答案:

from sqlalchemy import create_engine, Table, MetaData

dbUrl = 'postgres://localhost:5432/databaseName'   #will be different for different db's

engine = create_engine(dbUrl)
meta = MetaData()

table = Table('tableName', meta, autoload=True, autoload_with=engine)
Run Code Online (Sandbox Code Playgroud)

[0] 并不总是 PK,仅当 PK 只有一列时。table.primary_key.columns.values() 是一个列表。为了获得多列 pk 的所有列,您可以使用:

primaryKeyColNames = [pk_column.name for pk_column in table.primary_key.columns.values()]
Run Code Online (Sandbox Code Playgroud)