我必须在SQLAlchemy的级联选项中遗漏一些简单的东西,因为我无法通过简单的级联删除来正确操作 - 如果父元素被删除,子元素会持久存在,使用null外键.
我在这里提出了一个简洁的测试用例:
from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Parent(Base):
__tablename__ = "parent"
id = Column(Integer, primary_key = True)
class Child(Base):
__tablename__ = "child"
id = Column(Integer, primary_key = True)
parentid = Column(Integer, ForeignKey(Parent.id))
parent = relationship(Parent, cascade = "all,delete", backref = "children")
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
parent = Parent()
parent.children.append(Child()) …Run Code Online (Sandbox Code Playgroud) 我有一个SQLAlchemy查询对象,想要获取已编译的SQL语句的文本,并绑定其所有参数(例如,没有%s或其他变量等待语句编译器或MySQLdb方言引擎等绑定).
调用str()查询会显示如下内容:
SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC
Run Code Online (Sandbox Code Playgroud)
我试过查询query._params,但它是一个空的字典.我使用这个sqlalchemy.ext.compiler.compiles装饰器的例子编写了我自己的编译器,但即使是那里的语句仍然有%s我想要的数据.
我无法弄清楚何时混入我的参数来创建查询; 在检查查询对象时,它们总是一个空字典(尽管查询执行正常,引擎在打开echo日志时将其打印出来).
我开始得到SQLAlchemy不希望我知道底层查询的消息,因为它打破了表达式API接口所有不同DB-API的一般性质.我不介意在我发现它之前是否执行了查询; 我只是想知道!
我在文档中找不到关于此的任何信息,但是如何获得在SQLAlchemy中创建的表的列表?
我使用类方法来创建表.
我对SQLAlchemy没有多少经验,我遇到了一个问题,我无法解决.我试过搜索,我尝试了很多代码.这是我的类(缩减为最重要的代码):
class Patient(Base):
__tablename__ = 'patients'
id = Column(Integer, primary_key=True, nullable=False)
mother_id = Column(Integer, ForeignKey('patients.id'), index=True)
mother = relationship('Patient', primaryjoin='Patient.id==Patient.mother_id', remote_side='Patient.id', uselist=False)
phenoscore = Column(Float)
Run Code Online (Sandbox Code Playgroud)
我想询问所有患者,其母亲的现象是(例如) == 10
据说,我尝试了很多代码,但我没有得到它.在我看来,逻辑上的解决方案就是
patients = Patient.query.filter(Patient.mother.phenoscore == 10)
Run Code Online (Sandbox Code Playgroud)
因为,您可以.mother.phenoscore在输出时访问每个元素但是,此代码不会这样做.
有没有(直接)过关系属性过滤的可能性(没有编写SQL语句或额外的连接语句),我需要这种过滤器不止一次.
即使没有简单的解决方案,我也很乐意得到所有答案.
只是一个简单的问题:SQLAlchemy 谈到调用sessionmaker()一次,但Session()每次需要与数据库通信时调用结果类.对我来说,这意味着第二个我会做我的第一个session.add(x)或类似的东西,我会先做
from project import Session
session = Session()
Run Code Online (Sandbox Code Playgroud)
我到目前为止所做的是session = Session()在我的模型中进行一次调用,然后始终在我的应用程序中的任何位置导入相同的会话.由于这是一个Web应用程序,这通常意味着相同(执行一个视图).
但差异在哪里?在我的功能完成之前,一直使用一个会话反对我的数据库使用它然后在我想要与我的数据库交谈时创建一个新会话的缺点是什么?
如果我使用多个线程,我会得到它,每个线程应该得到自己的会话.但是使用scoped_session(),我已经确定问题不存在,是吗?
请澄清我的任何假设是否错误.
我有以下SQLAlchemy映射类:
class User(Base):
__tablename__ = 'users'
email = Column(String, primary_key=True)
name = Column(String)
class Document(Base):
__tablename__ = "documents"
name = Column(String, primary_key=True)
author = Column(String, ForeignKey("users.email"))
class DocumentsPermissions(Base):
__tablename__ = "documents_permissions"
readAllowed = Column(Boolean)
writeAllowed = Column(Boolean)
document = Column(String, ForeignKey("documents.name"))
Run Code Online (Sandbox Code Playgroud)
我需要得到一个这样的表user.email = "user@email.com":
email | name | document_name | document_readAllowed | document_writeAllowed
Run Code Online (Sandbox Code Playgroud)
如何使用SQLAlchemy的一个查询请求?以下代码对我不起作用:
result = session.query(User, Document, DocumentPermission).filter_by(email = "user@email.com").all()
Run Code Online (Sandbox Code Playgroud)
谢谢,
根据文档和sqlalchemy.Column类中的注释,我们应该使用该类sqlalchemy.schema.Index来指定包含多个列的索引.
但是,该示例显示了如何通过直接使用Table对象来执行此操作,如下所示:
meta = MetaData()
mytable = Table('mytable', meta,
# an indexed column, with index "ix_mytable_col1"
Column('col1', Integer, index=True),
# a uniquely indexed column with index "ix_mytable_col2"
Column('col2', Integer, index=True, unique=True),
Column('col3', Integer),
Column('col4', Integer),
Column('col5', Integer),
Column('col6', Integer),
)
# place an index on col3, col4
Index('idx_col34', mytable.c.col3, mytable.c.col4)
Run Code Online (Sandbox Code Playgroud)
如果我们使用声明性ORM扩展,我们该怎么做?
class A(Base):
__tablename__ = 'table_A'
id = Column(Integer, , primary_key=True)
a = Column(String(32))
b = Column(String(32))
Run Code Online (Sandbox Code Playgroud)
我想要列"a"和"b"的索引.
如何使用Flask-SQLAlchemy删除单个表中的所有行?
寻找这样的东西:
>>> users = models.User.query.all()
>>> models.db.session.delete(users)
# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped
Run Code Online (Sandbox Code Playgroud) 我是烧瓶和sqlalchemy的新手,我刚刚开始研究烧瓶应用程序,我现在正在使用sqlalchemy.我想知道使用flask-sqlalchemy vs sqlalchemy是否有任何重大好处.我在http://packages.python.org/Flask-SQLAlchemy/index.html找不到足够的动机,或者我不明白这个价值!非常感谢您的澄清.
我有一个名为Person的ORM类,它包含一个person表:
在设置与db等的连接之后,我运行ff语句.
people = session.query(Person).all()
人员表不包含任何数据(至今),因此当我打印变量人员时,我得到一个空列表.
我将我的ORM类People中引用的表重命名为people_foo(不存在).
然后我再次运行脚本.我很惊讶在尝试访问不存在的表时没有抛出任何异常.
因此,我有以下两个问题:
如果它有帮助,我使用PostgreSQL作为数据库
[编辑]
我正在写一个包.在我的people脚本中,我有以下代码(在此缩写):
people = session.query(Person).all()
Run Code Online (Sandbox Code Playgroud)
[EDIT2]
common模块正确设置记录器,我可以在导入common的其他模块中使用logger.
但是在dbfuncs模块中,我收到以下错误/警告:
没有找到记录器"sqlalchemy.engine.base.Engine"的处理程序