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)
这两种方法有什么区别?
我想问一下两者之间的区别
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类分布在几个文件中,而我可以为生活找不到如何做到这一点.我对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) 我正在使用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)
当然,在真正的查询中通常会有一些过滤器等.
我正在使用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,而且针对每个等效场景.
闭上眼睛打"发布你的问题"并等待聪明的人和蟒蛇人用心去追捕我,因为他们可能会说些不合适的东西 ;-)
如果使用PostgreSQL(Postgres),有没有办法在SQLAlchemy中将列(主键)定义为UUID?
一切都在标题中.是否有"Pythonic"方式(我的意思是,没有"纯SQL"查询)来使用SQLAlchemy定义SQL视图?
谢谢你的帮助,
我最近在使用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.
我一直在谷歌搜索和阅读SQLAlchemy文档,但没有找到我要找的东西.
我在SQLAlchemy中寻找一个函数,它将查询返回的结果数量限制为某个数字,例如:5?像first()或的东西all().
我已经有一个现有的数据库,里面有很多表和很多数据MySQL.我打算创建一个Flask应用程序并使用sqlalchemy.现在我问了irc并在google上四处寻找并尝试了以下想法:
首先,我使用sqlacodegen从我的生成模型DB.但后来我对此感到困惑,看了一下.我找到了这个.
这看起来像一个优雅的解决方案
所以其次,我models.py根据那里的解决方案改写了我,现在我更加困惑.我正在寻找最好的方法来构建这个烧瓶应用程序以及现有的数据库.
我查看了烧瓶文档但是对于已经存在的db的项目没有真正得到任何帮助.从头开始创建内容有很多好东西,创建数据库和所有内容.但我真的很困惑.
请注意它是我的第一天Flask,但我有经验Django,所以基本概念不是障碍.我需要一些指导来为这个用例选择最佳方法.非常感谢详细解释.通过详细说明我绝对不希望有人写下所有的代码和勺子喂我这个,但足以让我开始,这是将这个数据库无缝地集成到flaskvia中sqlalchemy.注意我的数据库在MySQL.
sqlalchemy ×10
python ×8
flask ×2
orm ×2
postgresql ×2
bottle ×1
django-orm ×1
mysql ×1
uuid ×1