标签: sqlalchemy

declarative_base()和db.Model有什么区别?

Flask-SQLAlchemy插件的快速入门教程指示用户创建继承db.Model该类的表模型,例如

app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
    __tablename__ = 'users'
    ...
Run Code Online (Sandbox Code Playgroud)

但是,SQLAlchemy教程和bottle-SQLAlchemy 自述文件都建议表模型继承Base实例化declarative_base().

Base = declarative_base()
class Users(Base):
    __tablename__ = 'users'
    ...
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?

python sqlalchemy bottle flask flask-sqlalchemy

70
推荐指数
1
解决办法
7494
查看次数

Sqlalchemy - for循环中查询和查询之间的区别

我想问一下两者之间的区别

for row in session.Query(Model1):
    pass
Run Code Online (Sandbox Code Playgroud)

for row in session.Query(Model1).all():
    pass
Run Code Online (Sandbox Code Playgroud)

是第一个以某种方式用单个查询轰炸你的数据库的迭代器,而后者"急切地"将整个事件作为一个列表(如range(x)vs xrange(x))查询?

sqlalchemy

68
推荐指数
2
解决办法
3万
查看次数

跨文件的SQLAlchemy类

我正在试图弄清楚如何将SQLAlchemy类分布在几个文件中,而我可以为生活找不到如何做到这一点.我对SQLAlchemy很新,所以如果这个问题很简单,请原谅我.

每个自己的文件中考虑这3个类:

A.py:

from sqlalchemy import *
from main import Base

class A(Base):
    __tablename__ = "A"
    id  = Column(Integer, primary_key=True)
    Bs  = relationship("B", backref="A.id")
    Cs  = relationship("C", backref="A.id")
Run Code Online (Sandbox Code Playgroud)

B.py:

from sqlalchemy import *
from main import Base

class B(Base):
    __tablename__ = "B"
    id    = Column(Integer, primary_key=True)
    A_id  = Column(Integer, ForeignKey("A.id"))
Run Code Online (Sandbox Code Playgroud)

C.py:

from sqlalchemy import *
from main import Base

class C(Base):
    __tablename__ = "C"    
    id    = Column(Integer, primary_key=True)
    A_id  = Column(Integer, ForeignKey("A.id"))
Run Code Online (Sandbox Code Playgroud)

然后说我们有一个像这样的main.py:

from sqlalchemy import …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

68
推荐指数
3
解决办法
2万
查看次数

SQL Alchemy ORM返回单列,如何避免常见的后期处理

我正在使用SQL Alchemy的ORM,当我返回单个列时,我发现我得到的结果如下:

[(result,), (result_2,)] # etc...
Run Code Online (Sandbox Code Playgroud)

有了这样的一套,我发现我必须经常这样做:

results = [r[0] for r in results] # So that I just have a list of result values
Run Code Online (Sandbox Code Playgroud)

这不是"坏",因为我的结果集通常很小,但如果不是这样,可能会增加很多开销.最重要的是我觉得它使源变得混乱,错过这一步是我遇到的一个非常常见的错误.

有没有办法避免这个额外的步骤?

一个相关的旁白:在ORM的这种行为似乎在这种情况下不方便,但在我的结果集是另一种情况,[(ID,值)]它最终是这样的:

[(result_1_id, result_1_val), (result_2_id, result_2_val)]
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

results = dict(results) # so I have a map of id to value
Run Code Online (Sandbox Code Playgroud)

这个有一个优点,在返回结果后作为一个有用的步骤.

这真的是一个问题,还是我只是一个挑剔的事情,获得​​结果集后的后期处理对两种情况都有意义?我确信我们可以考虑其他一些常见的后处理操作,以使结果集在应用程序代码中更加可用.是否有全面的高性能和方便的解决方案,或者后处理是不可避免的,仅仅需要不同的应用程序使用?

当我的应用程序实际上可以由SQL炼金术的ORM返回的对象的优势似乎非常有帮助,但在情况下,我不能或不会,没有这么多.这一般只是ORM的常见问题吗?在这样的情况下,我最好不要使用ORM层吗?

我想我应该展示一下我正在谈论的实际orm查询的一个例子:

session.query(OrmObj.column_name).all()
Run Code Online (Sandbox Code Playgroud)

要么

session.query(OrmObj.id_column_name, OrmObj.value_column_name).all()
Run Code Online (Sandbox Code Playgroud)

当然,在真正的查询中通常会有一些过滤器等.

python orm sqlalchemy

68
推荐指数
4
解决办法
2万
查看次数

如何优雅地检查对象/实例/变量的存在,并同时将其分配给变量(如果它存在于python中)?

我正在使用SQLAlchemy来填充数据库,我经常需要在处理之前检查数据库中是否存在orm对象.这可能是一个非传统的问题,但我发现自己经常遇到这种模式:

my_object = session.query(SomeObject).filter(some_fiter).first()
if my_object: # Mostly in databases...
    # Juchee it exists
    # process
else:
    # It does not exist. :-(
    my_object = SomeObject()
    # process
Run Code Online (Sandbox Code Playgroud)

梦想的是:

if my_object = session.query(someObject).blabla.first():
    # if my_object is None this scope is left alone
    # if my_object is not None I can work with my_object here...
Run Code Online (Sandbox Code Playgroud)

我知道,这种语法是错误的,但我想解释一下,我的意思是这个例子.任何等效的方式都会让我开心.

这种模式有一种优雅的python方法吗?这个问题不仅针对SQLAlchemy,而且针对每个等效场景.

闭上眼睛打"发布你的问题"并等待聪明的人和蟒蛇人用心去追捕我,因为他们可能会说些不合适的东西 ;-)

python sqlalchemy

66
推荐指数
4
解决办法
6万
查看次数

65
推荐指数
9
解决办法
4万
查看次数

如何使用SQLAlchemy创建SQL视图?

一切都在标题中.是否有"Pythonic"方式(我的意思是,没有"纯SQL"查询)来使用SQLAlchemy定义SQL视图?

谢谢你的帮助,

python postgresql sqlalchemy

65
推荐指数
4
解决办法
4万
查看次数

SQLAlchemy可以做什么,Django ORM不能做的例子

我最近在使用Pyramid和SQLAlchemy进行了大量的研究,而不是在Django中保留当前的应用程序.这本身就是一场辩论,但我不是在讨论这个问题.

我想知道的是,为什么SQLAlchemy普遍被认为比Django ORM更好?几乎每一个(如果不是每一个)我在SQLAlchemy这两个好处之间找到的比较.我认为性能是一个很大的性能,因为SQLAlchemy的结构可以让它更顺利地转换为SQL.

但是,我也听说过,使用更难的任务,Django ORM几乎不可能使用.我想说明这可能是一个多大的问题.我一直在阅读切换到SQLAlchemy的原因之一是当Django ORM不再适合您的需求时.

因此,简而言之,有人可以提供SQLAlchemy可以执行的查询(不一定是实际的SQL语法),但Django ORM不可能在没有添加额外的原始SQL的情况下做到吗?

更新:

自从我第一次问到这个问题以来,我一直注意到这个问题得到了很多关注,所以我想多花两美分.

最后我们最终使用了SQLAlchemy,我必须说我对这个决定感到满意.

我正在重新审视这个问题以提供SQLAlchemy的一个额外功能,到目前为止,我还没有能够在Django ORM中复制.如果有人可以提供一个如何做到这一点的例子,我会很乐意吃掉我的话.

假设您想使用一些postgresql函数,例如similarity(),它提供模糊比较(请参阅:快速查找与PostgreSQL类似的字符串 - tl; dr输入两个字符串获得百分比相似性).

我已经用Django ORM做了一些关于如何做到这一点的搜索,除了使用原始的sql之外什么也没发现,因为他们的文档中似乎很明显:https://docs.djangoproject.com/en/dev/topics/db/sql /.

Model.objects.raw('SELECT * FROM app_model ORDER BY \
similarity(name, %s) DESC;', [input_name])
Run Code Online (Sandbox Code Playgroud)

但是,SQLalchemy有func(),如下所述:http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.func

from sqlalchemy import desc, func
session.query(Model).order_by(func.similarity(Model.name, input_name))
Run Code Online (Sandbox Code Playgroud)

这允许您为任何已定义的sql/postgresql/etc函数生成sql,而不需要原始sql.

python sqlalchemy django-orm

65
推荐指数
2
解决办法
1万
查看次数

SQLAlchemy查询只返回n个结果?

我一直在谷歌搜索和阅读SQLAlchemy文档,但没有找到我要找的东西.

我在SQLAlchemy中寻找一个函数,它将查询返回的结果数量限制为某个数字,例如:5?像first()或的东西all().

sqlalchemy

65
推荐指数
3
解决办法
4万
查看次数

如何围绕现有数据库构建烧瓶应用程序?

我已经有一个现有的数据库,里面有很多表和很多数据MySQL.我打算创建一个Flask应用程序并使用sqlalchemy.现在我问了irc并在google上四处寻找并尝试了以下想法:

首先,我使用sqlacodegen从我的生成模型DB.但后来我对此感到困惑,看了一下.我找到了这个.

这看起来像一个优雅的解决方案

所以其次,我models.py根据那里的解决方案改写了我,现在我更加困惑.我正在寻找最好的方法来构建这个烧瓶应用程序以及现有的数据库.

我查看了烧瓶文档但是对于已经存在的db的项目没有真正得到任何帮助.从头开始创建内容有很多好东西,创建数据库和所有内容.但我真的很困惑.

请注意它是我的第一天Flask,但我有经验Django,所以基本概念不是障碍.我需要一些指导来为这个用例选择最佳方法.非常感谢详细解释.通过详细说明我绝对不希望有人写下所有的代码和勺子喂我这个,但足以让我开始,这是将这个数据库无缝地集成到flaskvia中sqlalchemy.注意我的数据库在MySQL.

python mysql sqlalchemy flask flask-sqlalchemy

64
推荐指数
5
解决办法
4万
查看次数