Django有一些从DB到JSON格式返回的ORM模型的自动序列化.
如何将SQLAlchemy查询结果序列化为JSON格式?
我试过,jsonpickle.encode但它编码查询对象本身.我试过了,json.dumps(items)但它回来了
TypeError: <Product('3', 'some name', 'some desc')> is not JSON serializable
Run Code Online (Sandbox Code Playgroud)
是否真的很难将SQLAlchemy ORM对象序列化为JSON/XML?它没有默认的序列化器吗?现在序列化ORM查询结果是非常常见的任务.
我需要的只是返回SQLAlchemy查询结果的JSON或XML数据表示.
需要在javascript datagird中使用SQLAlchemy对象的JSON/XML格式的查询结果(JQGrid http://www.trirand.com/blog/)
这个主题暂时没有在这里或其他地方得到解决.有没有将SQLAlchemy <Query object>转换为pandas DataFrame 的解决方案?
Pandas有能力使用,pandas.read_sql但这需要使用原始SQL.我有两个理由想要避免它:1)我已经拥有使用ORM的一切(这本身就是一个很好的理由)和2)我使用python列表作为查询的一部分(例如:我的模型类.db.session.query(Item).filter(Item.symbol.in_(add_symbols)在哪里Item并且add_symbols是一个列表).这相当于SQL SELECT ... from ... WHERE ... IN.
有可能吗?
我已经将SQLAlchemy更新为0.6,但它打破了一切.我注意到它不再返回字典而不是字典了.这是一个示例查询:
query = session.query(User.id, User.username, User.email).filter(and_(User.id == id, User.username == username)).limit(1)
result = session.execute(query).fetchone()
Run Code Online (Sandbox Code Playgroud)
这段代码用于返回0.5中的字典.
我的问题是如何归还字典?
我想将我的查询结果转换为这样的dicts列表:
result_dict = [{'category': 'failure', 'week': '1209', 'stat': 'tdc_ok', 'severityDue': '2_critic'}, {'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'}]
Run Code Online (Sandbox Code Playgroud)
但相反,我把它作为一个字典,因此重复键:
result_dict = {'category': 'failure', 'week': '1209', 'stat': 'tdc_ok', 'severityDue': '2_critic', 'category': 'failure', 'week': '1210', 'stat': 'tdc_nok', 'severityDue': '2_critic'}
Run Code Online (Sandbox Code Playgroud)
我通过这样做得到这个结果:
for u in my_query.all():
result_dict = u.__dict__
Run Code Online (Sandbox Code Playgroud)
如何将sqlAlchemy查询结果转换为dicts列表(每行都是dict)?
请帮忙
如何将 sqlalchemy.engine.result.RowProxy 转换为字典?
row = db.engine.execute(sql, id=id).fetchone()
Run Code Online (Sandbox Code Playgroud)
尝试从 SO问题使用这个:
for c in inspect(obj).mapper.column_attrs:
model_col = getattr(obj, c.key)
model_dict[c.key] = model_col
Run Code Online (Sandbox Code Playgroud)
错误:
sqlalchemy.exc.NoInspectionAvailable: No inspection system is available for object of type <class 'sqlalchemy.engine.result.RowProxy'>
Run Code Online (Sandbox Code Playgroud) 我正在评估在异步/等待FastAPI应用程序中使用SQLAlchemy的潜在设置。目前,我正在使用declarative_base类编写模型和查询,然后使用数据库执行查询(对于模型类,语法更易读易写;直接使用SQLAlchemy核心表不是我的最爱活动)。这一切都很好。
在这一点上,我有SQLAlchemy结果行,但是我需要将它们转换为通用dict,由于急切加载的关系而可能嵌套(仅在此环境中支持类型)。我不能使用SQLAlchemy的ORM,因为1)我没有engineor session;2)ORM假定只要需要将其加载到对象中就可以访问数据库,而在异步/等待FastAPI应用程序中则不是这种情况。
是否有人对如何实现这一目标有想法或指示?我正在努力弄清楚如何将结果行与特定的关系键相关联。我一直在研究SQLAlchemy的内部思想,但是它很不透明,因为其中很多都假设我的设置中没有出现整个对象缓存和会话/引擎管理层。
我可以使用以下两点想法:
table_1_column_name到特定模型及其属性感谢您的任何帮助,您可以提供!
更新:您可以在此处找到一个可运行的示例:https : //gist.github.com/onecrayon/dd4803a5099061fa48d52f2d4bc2396b(有关位置,请参见第92-109行,我需要弄清楚如何通过映射将RowProxy转换为嵌套字典查询列名称到SQLAlchemy模型上的名称)。
采取以下代码:
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String
engine = create_engine('postgresql://postgres:password@localhost:5432/db', echo=True, echo_pool='debug')
Base = declarative_base()
class Item(Base):
__tablename__ = 'items'
id = Column(Integer, primary_key=True)
name = Column(String)
def __repr__(self):
return "<Item(id=%s, name='%s')>" % (self.id, self.name)
item = Item(name="computer")
Run Code Online (Sandbox Code Playgroud)
Item有没有办法获得包含所有字段的 python 字典?例如,我想返回以下内容:
item.to_dict()
{"id": None, "name": "computer"}
Run Code Online (Sandbox Code Playgroud)
或者我必须编写自己的方法来做到这一点?
所有,
我正在读一个csv文件并使用sqlalchemy将数据添加到MySQL数据库.其中一个表是地址表,它只能保存唯一的地址.这些地址与另一个具有地址id的外键字段的"语句"表之间存在关系.
因此,对于我的数据文件中的每一行,我创建一个新的语句obj,然后获取相关地址的id.如果地址已存在,则返回该id.否则,我创建一个新的地址obj并返回该id.这是使用下面的代码完成的,改编自这个SO问题.
def get_or_create(self, model, rec):
instance = self.session.query(model).filter_by(**dict(filter(lambda (x,y): x in model.__dict__.keys(), rec.iteritems()))).first()
if instance:
return instance
else:
instance = model(rec)
return instance
Run Code Online (Sandbox Code Playgroud)
我正在使用GUID作为我的id字段,它是地址表的主键的一部分:
class address(Base):
__tablename__ = 'address'
id = id_column()
name = Column(String(75), primary_key=True)
Address_Line_One = Column(String(50), primary_key=True)
Address_Line_Two = Column(String(50), primary_key=True)
Address_Line_Three = Column(String(50), primary_key=True)
Address_Line_Four = Column(String(50), primary_key=True)
Run Code Online (Sandbox Code Playgroud)
将id_column()来自这里,虽然它已被转换为CHAR(32)由于限制别处.最后,这里有一个片段:
currStatement = statements(rec, id=currGUID)
currStatement.address = self.get_or_create(address, rec)
Run Code Online (Sandbox Code Playgroud)
这一切都很好,除非它很慢.对于在一个事务中插入的~65,000个语句,我看到干净测试DB上的1.5小时插入时间.实时观察插入显示它快速达到~10,000行,然后插入速度开始下降.
我该怎么做才能加快插入时间?
编辑:
经过进一步测试,我发现插入时间慢是因为每个对象都是单独插入的.所以,我有~65,000行,每行都有几个sqlalchemy对象,单独插入.使用sqlalchemy 0.7,我如何批量插入对象?
我有下表:
Base = declarative_base()
metadata = Base.metadata
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(255))
email = Column(String(255))
Run Code Online (Sandbox Code Playgroud)
是否有可能获得一个字典,对于空记录将返回如下内容:
{'id': None, 'username': None, 'email': None}
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
user = User()
user.username = "testuser"
user.email = "test@example.com"
Run Code Online (Sandbox Code Playgroud)
我希望能够获得具有相应值的字典。当然,如果我保存记录,我希望它也id有。
我试图使用Flask Alchemy和Flask Marshmallow从数据库查询后返回json数据
但是,我的代码总是以某种方式返回空的JSON数据。
这是我的代码:
我的看法 :
@app.route('/customer/', methods=['GET'])
def get_customer():
customers = models.Customer.query.all()
#c = models.Customer.query.get(1) # Get Customer with an ID of 1
customers_schema = CustomerSchema()
print customers_schema.dump(customers).data
payload = customers_schema.dump(customers).data
resp = Response(response=payload, status=200, mimetype="application/json")
return(resp)
Run Code Online (Sandbox Code Playgroud)
我的模特:
class Customer(db.Model):
id = db.Column(db.Integer, primary_key=True)
nickname = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
address = db.relationship('Address', backref='customer', lazy='dynamic')
def __repr__(self):
return '<Customer %r>' % (self.nickname)
Run Code Online (Sandbox Code Playgroud)
我的架构:
class CustomerSchema(ma.ModelSchema):
class Meta:
model = Customer
Run Code Online (Sandbox Code Playgroud)
这是从控制台看到的结果:
* Debugger is …Run Code Online (Sandbox Code Playgroud) 假设您想在 sqlalchemy 中迭代 ORM 类的 ORM 属性。因此,您需要一个 ORM 属性列表。你是怎么得到那个名单的?
如果 ORM 类没有重命名属性,因此 ORM 属性与数据库列匹配,那么您可以使用以下解决方案:https : //stackoverflow.com/a/24748320/1023033 (顺便说一句,还有一个内置的源代码文件 /lib/sqlalchemy/orm/base.py 中的(私有)函数 _orm_columns() 似乎提供了此功能)
但是如果 python ORM 类的名称与数据库列的名称不同(例如在这 3 个 ORM 属性中):
>>> class User(Base):
... __tablename__ = 'users'
...
... id = Column('pkey', Integer, primary_key=True)
... name = Column('user_name', String)
... fullname = Column('human_name', String)
Run Code Online (Sandbox Code Playgroud)
那么那个方法就行不通了。那么,如何获得 ORM 属性的 Python 版本呢?
python ×10
sqlalchemy ×10
json ×2
async-await ×1
bulkinsert ×1
fastapi ×1
flask ×1
mysql ×1
pandas ×1