Python 如何在SQLAlchemy ORM中打印所有列
使用SQLAlchemy,我试图以类似于以下方式打印出每个模型的所有属性:Python 如何在SQLAlchemy ORM中打印所有列,python,sqlalchemy,Python,Sqlalchemy,使用SQLAlchemy,我试图以类似于以下方式打印出每个模型的所有属性: SELECT * from table; 但是,我希望在获得每个模型实例信息时对其进行处理。到目前为止,我能想到的最好的方法是: for m in session.query(model).all(): print [getattr(m, x.__str__().split('.')[1]) for x in model.__table__.columns] # additional code 这会
SELECT * from table;
但是,我希望在获得每个模型实例信息时对其进行处理。到目前为止,我能想到的最好的方法是:
for m in session.query(model).all():
print [getattr(m, x.__str__().split('.')[1]) for x in model.__table__.columns]
# additional code
这会给我我想要的,但这是一个相当迂回的方法。我希望有这样一个特点:
m.attributes
# or
m.columns.values
我觉得我错过了一些东西,有一个更好的方法可以做到这一点。我这样做是因为我将把所有内容都打印到.CSV文件中,我不想指定我感兴趣的列/属性,我想要所有内容(很多模型中有很多列要打印)。看看SQLAchemy的功能 可以指示表对象从数据库中已存在的相应数据库架构对象加载关于其自身的信息。这个过程叫做反射
你可能会对我的想法感兴趣
from sqlalchemy.orm import class_mapper
import collections
# structure returned by get_metadata function.
MetaDataTuple = collections.namedtuple("MetaDataTuple",
"coltype, colname, default, m2m, nullable, uselist, collection")
def get_metadata_iterator(class_):
for prop in class_mapper(class_).iterate_properties:
name = prop.key
if name.startswith("_") or name == "id" or name.endswith("_id"):
continue
md = _get_column_metadata(prop)
if md is None:
continue
yield md
def get_column_metadata(class_, colname):
prop = class_mapper(class_).get_property(colname)
md = _get_column_metadata(prop)
if md is None:
raise ValueError("Not a column name: %r." % (colname,))
return md
def _get_column_metadata(prop):
name = prop.key
m2m = False
default = None
nullable = None
uselist = False
collection = None
proptype = type(prop)
if proptype is ColumnProperty:
coltype = type(prop.columns[0].type).__name__
try:
default = prop.columns[0].default
except AttributeError:
default = None
else:
if default is not None:
default = default.arg(None)
nullable = prop.columns[0].nullable
elif proptype is RelationshipProperty:
coltype = RelationshipProperty.__name__
m2m = prop.secondary is not None
nullable = prop.local_side[0].nullable
uselist = prop.uselist
if prop.collection_class is not None:
collection = type(prop.collection_class()).__name__
else:
collection = "list"
else:
return None
return MetaDataTuple(coltype, str(name), default, m2m, nullable, uselist, collection)
我相信这是最简单的方法:
print [cname for cname in m.__dict__.keys()]
编辑:我上面的答案使用sqlalchemy.inspection.inspect()似乎是一个更好的解决方案。我使用它是因为它稍微短一些:
for m in session.query(*model.__table__.columns).all():
print m
基于Rodney L的回答:
model = MYMODEL
columns = [m.key for m in model.__table__.columns]
这是一篇旧文章,但我遇到了一个问题,实际的数据库列名与实例上映射的属性名不匹配。我们最终得出结论:
from sqlalchemy import inspect
inst = inspect(model)
attr_names = [c_attr.key for c_attr in inst.mapper.column_attrs]
希望这能帮助有同样问题的人 把这些放在一起,发现它很有用:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
engine = create_engine('mysql+pymysql://testuser:password@localhost:3306/testdb')
DeclarativeBase = declarative_base()
metadata = DeclarativeBase.metadata
metadata.bind = engine
# configure Session class with desired options
Session = sessionmaker()
# associate it with our custom Session class
Session.configure(bind=engine)
# work with the session
session = Session()
然后:
d = {k: metadata.tables[k].columns.keys() for k in metadata.tables.keys()}
示例输出打印(d)
:
或者,然后:
from sqlalchemy.sql import text
cmd = "SELECT * FROM information_schema.columns WHERE table_schema = :db ORDER BY table_name,ordinal_position"
result = session.execute(
text(cmd),
{"db": "classicmodels"}
)
result.fetchall()
可能是最短的解决方案(参见最近的: 如果将最后一行改写为三行,则看起来更可读:
table = inspect(model)
for column in table.c:
print column.name
我正在Python 3.5.2上使用SQL Alchemy V1.0.14 假设您可以使用create_engine()连接到引擎,我可以使用以下代码显示所有列。用适当的值替换“我的连接字符串”和“我的表名”
from sqlalchemy import create_engine, MetaData, Table, select
engine = create_engine('my connection string')
conn = engine.connect()
metadata = MetaData(conn)
t = Table("my table name", metadata, autoload=True)
columns = [m.key for m in t.columns]
columns
最后一行仅显示上一条语句中的列名
print repr(model.__table__)
或者只是列:
print str(list(model.__table__.columns))
迪克特并不总是能帮上忙。我使用keys=self.\u sa\u instance\u state.attrs.items()没有帮助..如果我们在模型下定义了多个函数,这将使用flask的sqlalchemy ORM获得这些函数。我能够通过以下方式获得列名:data\u table.\u table\u.columns
{I.name:getattr(m,I.name)for I in m.\u table\u.columns}
这对我来说很好。链接似乎断了。你能粘贴一些示例代码吗,“元数据反射”应该如何工作?此链接是否指向正确的检查,请注意get\u columns
功能?非常有用。非常感谢。同样,如果您正在查找关系:rel\u names=[rel.key for rel in inst.mapper.relationships]
。你也可以找到同义词和复合词:很好的解决方案,这解决了我的问题
print repr(model.__table__)
print str(list(model.__table__.columns))