从Python sqlalchemy连接对象获取表描述,并将表名称作为字符串



从Python中的sqlalchemy连接对象和作为字符串的表名开始,我如何获得表属性,例如列名和数据类型。

例如,连接到sqlalchemy中的数据库

from sqlalchemy import create_engine
conn = create_engine('mssql+pyodbc://...driver=ODBC+Driver+17+for+SQL+Server').connect()

connsqlalchemy连接对象

In [1]: conn
Out[1]: <sqlalchemy.engine.base.Connection at 0x7feb6efef070>

如何基于字符串形式的表名获取表属性,例如table = '...'

应该工作,但却创建了一个空的DataFrame

from sqlalchemy import text
import pandas as pd
query = f"""SELECT * FROM information_schema.columns WHERE table_name='{table}'"""
df = pd.read_sql_query(text(query), conn)
In [2]: df
Out[2]:
Empty DataFrame
Columns: [TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION, COLUMN_DEFAULT, IS_NULLABLE, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH, NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE, DATETIME_PRECISION, CHARACTER_SET_CATALOG, CHARACTER_SET_SCHEMA, CHARACTER_SET_NAME, COLLATION_CATALOG, COLLATION_SCHEMA, COLLATION_NAME, DOMAIN_CATALOG, DOMAIN_SCHEMA, DOMAIN_NAME]
Index: []
versions:
sqlalchemy - 2.0.4
pandas - 1.5.3

您编写了

conn = create_engine(...)

更喜欢将其表述为

engine = create_engine(...)

从RDBMS动态加载详细信息(使用sqlalchemy 1.4):

from pprint import pp
import sqlachemy as sa
engine = ...
meta = sa.MetaData(bind=engine)
my_table = sa.Table('my_table', meta, autoload=True)
for column in my_table.c:
print(column)

看看pp(dir(my_table))其他可用的详细信息
也称为help(my_table)

此外,生成的表对象是方便的会议开始地点SELECT查询、INSERT等等。


编辑

SqlAlchemy 2.0是一个突破性的变化。文档解释一下你应该使用这个备用关键字:

meta = sa.MetaData()
my_table = sa.Table('my_table', meta, autoload_with=engine)

最新更新