从Python中的sqlalchemy
连接对象和作为字符串的表名开始,我如何获得表属性,例如列名和数据类型。
例如,连接到sqlalchemy
中的数据库
from sqlalchemy import create_engine
conn = create_engine('mssql+pyodbc://...driver=ODBC+Driver+17+for+SQL+Server').connect()
则conn
是sqlalchemy
连接对象
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)