GVKun编程网logo

SQLAlchemy Joinedload过滤器列(sqldeveloper过滤器)

21

如果您想了解SQLAlchemyJoinedload过滤器列和sqldeveloper过滤器的知识,那么本篇文章将是您的不二之选。我们将深入剖析SQLAlchemyJoinedload过滤器列的各个方

如果您想了解SQLAlchemy Joinedload过滤器列sqldeveloper过滤器的知识,那么本篇文章将是您的不二之选。我们将深入剖析SQLAlchemy Joinedload过滤器列的各个方面,并为您解答sqldeveloper过滤器的疑在这篇文章中,我们将为您介绍SQLAlchemy Joinedload过滤器列的相关知识,同时也会详细的解释sqldeveloper过滤器的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

SQLAlchemy Joinedload过滤器列(sqldeveloper过滤器)

SQLAlchemy Joinedload过滤器列(sqldeveloper过滤器)

嗨,我想使用joinedload对查询进行过滤。但是我似乎无法使其正常工作。以下是我的示例查询

result = (        session.query(Work).        options(            joinedload(Work.company_users).            joinedload(CompanyUser.user)        ).        filter(Work.id == 1).        filter(User.first_name == ''The name'').  <<--- I can''t get this to work.        all()    )

运行此命令时,它返回的行超出了我的期望。实际结果应仅返回8行。但是执行此查询后,它返回234行,这比我预期的要多

答案1

小编典典

它不起作用的原因是joinedload(以及所有其他关系加载技术)是完全透明的。也就是说,joinedload在查询中包含a不会导致填充关系,而不会以任何其他方式影响它。您应该阅读“加入渴望的禅宗”,其开头为:

由于急切的联合加载似乎与的使用非常相似Query.join(),因此经常混淆应何时使用以及如何使用它。了解区别的关键在于,尽管该区别Query.join()用于更改查询的结果,但joinedload()要花很长时间不更改查询的结果,而是隐藏呈现的联接的效果,以仅允许存在相关对象。

技巧之一是对无法使用的联接表使用别名。然后,您的查询最终在Work和User之间执行隐式交叉联接,从而在多余的行之间进行隐式交叉联接。因此,为了根据联接的表进行过滤,请使用Query.join()

session.query(Work).\    join(Work.company_users).\    join(CompanyUser.user).\    filter(Work.id == 1).\    filter(User.first_name == ''The name'').\    all()

并且如果还需要适当的预加载,则可以使用以下命令指示查询已包含联接contains_eager()

session.query(Work).\    join(Work.company_users).\    join(CompanyUser.user).\    options(contains_eager(Work.company_users).            contains_eager(CompanyUser.user)).\    filter(Work.id == 1).\    filter(User.first_name == ''The name'').\    all()

请注意对的链接调用contains_eager()

apscheduler遇到错误:SQLAlchemyJobStore requires SQLAlchemy

apscheduler遇到错误:SQLAlchemyJobStore requires SQLAlchemy

file

英文:SQLAlchemyJobStore requires SQLAlchemy installed

翻译下:SQLAlchemyJobStore需要安装SQLAlchemy

说白了就是需要安装SQLAlchemy

安装也很简单

pip install sqlalchemy

关注我获取更多内容

flask_sqlalchemy join的正确使用方法

flask_sqlalchemy join的正确使用方法

flask_sqlalchemy包裹了sqlalchemy一些操作,其能够更好的与flask协作,flask_sqlalchemy中的大部分api来自于sqlalchemy.orm.query.Query,直接使用集成db.Model类的query属性就可以得到Query类,例如一下实例

class Users(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    username = db.Column(db.String(20), unique=True, nullable=False)

    password = db.Column(db.String(40), nullable=False)

 

class File(db.Model):

    id = db.Column(db.Integer, primary_key=True)

    userid = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)

    filename = db.Column(db.String(40), nullable=False)

    filesize = db.Column(db.Integer)

直接使用File.query就会返回db.session.query(SomeMappedClass),使用的api参照Query的api。

在使用Qurey的join的时候采用代码,File.query.join(Users.id),这是官方给出的文档中的使用方式

 

但我在使用后出现错误

 

后来才发现,文档中说明了使用条件在User与Address存在mapping的,而我这里并没有,使用的db.Model类与官方的类也不相同,因此在文档后续中查找到了下面一条信息

 

这个是将传入的参数换为入口或者是表,这样才了解到之前的用法是有问题,按照这里的说法应该是可以传入一个表或者是另外的query,因此参数应该是这样的

File.query.join(Users.query)

File.query.join(Users)

File.query.join(Users.__table__)

通过源代码可以看到,flask_sqlalchemy会将定义的Column创建为一张sqlalchemy表并存在__table__中。而在这里Users.query代表了一个query入口,Model也应该实现了类似query相应的入口,因此可以简写。

 

flask_sqlalchemy和sqlalchemy的区别有哪些?

flask_sqlalchemy和sqlalchemy的区别有哪些?

概要的说:

  SQLAlchemy是python社区使用最广泛的ORM之一,SQL-Alchmy直译过来就是SQL炼金术。

  Flask-SQLAlchemy集成了SQLAlchemy,它简化了连接数据库服务器、管理数据库操作会话等各类工作,让Flask中的数据处理体验变得更加轻松。

  

  虽然我们要使用的大部分类和函数都由SQLAlchmey提供,但在Flask-SQLAlchemy中,大多数情况下,我们不需要手动从SQLAlchemy导入类或函数。在sqlalchemy和sqlalchemy.orm模块中实现的类和函数

,以及其他几个常用的模块和对象都可以作为db对象的属性调用。当我们创建这样的调用时,Flask-SQLAlchemy会自动把这些调用转发到对应的类、函数或模块

具体区别:

区别1:定义模型:

flask_sqlalchemy需要使用db.Column,而sqlalchemy则不需要 

flask_sqlalchemy写法:

1 class Role(db.Model):
2     __tablename__ = ''roles''
3     id = db.Column(db.Integer, primary_key=True)
4     name = db.Column(db.String(64))
5     user = db.relationship(''User'', backref=''role'')
6 
7     def __repr__(self):
8         return ''<Role %r>'' % self.name

 

sqlalcehmy写法:

1 class EnvConfig(Base):
2     __tablename__="env_config"
3     id=Column(Integer,primary_key=True)
4     host = Column(String(50))  # 默认值 1  0:appapi.5i5j.com,
5     def __repr__(self):
6         return "<EnvConfig.%s>"%self.host

 区别2:声明字段类型

flask_sqlalchemy使用定义字段类型时无须额外导入类型,一切类型都通过db对象直接调用

 1 from flask import Flask
 2 from flask_sqlalchemy import SQLAlchemy
 3 
 4 app = Flask(__name__)
 5 
 6 # 设置连接数据库的URL
 7 # 不同的数据库采用不同的引擎连接语句:
 8 # MySQL: mysql://username:password@hostname/database
 9 
10 app.config[''SQLALCHEMY_DATABASE_URI''] =''mysql+mysqlconnector://root:admin123456@10.1.71.32:3306/test''
11 
12 # 设置每次请求结束后会自动提交数据库的改动
13 app.config[''SQLALCHEMY_COMMIT_ON_TEARDOWN''] = True
14 app.config[''SQLALCHEMY_TRACK_MODIFICATIONS''] = True
15 
16 # 查询时显示原始SQL语句
17 app.config[''SQLALCHEMY_ECHO''] = False
18 db = SQLAlchemy(app)

 

sqlalchemy需要单独导入字段声明类型:

1 from sqlalchemy.ext.declarative import declarative_base
2 from sqlalchemy import Column,Integer,Text,String,Enum
3 Base =declarative_base()

完整的代码片断:

 

# 导入依赖
from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# 创建对象的基类
Base = declarative_base()

# 定义User对象
class User(Base):
    # 表的名字
    __tablename__ = ''user''

    # 表的结构
    id = Column(String(20), primary_key=True)
    name = Column(String(20))


# 初始化数据库链接
engine = create_engine(''mysql+mysqlconnector://root:123456@localhost:3306/test'')

# 创建DBSession类型
DBSession = sessionmaker(bind=engine)


# 添加
# 创建Session对象
session = DBSession()
# 创建User对象
new_user = User(id=''5'', name=''Bob'')
# 添加到session
session.add(new_user)
# 提交
session.commit()
# 关闭session
session.close()


# 查询
# 创建session
session = DBSession()
# 利用session创建查询,query(对象类).filter(条件).one()/all()
user = session.query(User).filter(User.id==''5'').one()
print(''type:{0}''.format(type(user)))
print(''name:{0}''.format(user.name))
# 关闭session
session.close()


# 更新
session = DBSession()
user_result = session.query(User).filter_by(id=''1'').first()
user_result.name = "jack"
session.commit()
session.close()


# 删除
session = DBSession()
user_willdel = session.query(User).filter_by(id=''5'').first()
session.delete(user4._willdel)
session.commit()
session.close()

 

 

 

区别3:

查询方式不一样

sqlalchemy通过session.query(模型名)查询

而flask_sqlalchemy则是通过 模型名.query查询

 

#SQLAlchemy 
result_id = session.query(ScriptRunResult).order_by(ScriptRunResult.id.desc()).all()[0].id
            result_id = 
#Flask-SQLAlchemy 
ScriptRunResult.query.order_by(ScriptRunResult.id.desc()).all()[0].id

 

flask_sqlalchemy和sqlalchemy联系区别及其使用方式

flask_sqlalchemy和sqlalchemy联系区别及其使用方式

### 使用SQLAlchemy去连接数据库:

1.使用SQLALchemy去连接数据库,需要使用一些配置信息,然后将他们组合成满足条件的字符串:
HOSTNAME = ''127.0.0.1''
PORT = ''3306''
DATABASE = ''1''
USERNAME = ''root''
PASSWORD = ''root''

DB_URI = "mysql+mysqlconnector://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

2.然后使用`create_engine`创建一个引擎`engine`,
engine = create_engine(DB_URI)

3.构建session对象:所有和数据库的ORM操作都必须通过一个叫做`session`的会话对象来实现,通过以下代码来获取会话对象:
from sqlalchemy.orm import sessionmaker

engine = create_engine(DB_URI)
session = sessionmaker(engine)()


4.将ORM模型映射到数据库中:
(1)用`declarative_base`根据`engine`创建一个ORM基类。
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine(DB_URI)
Base = declarative_base(engine)
(2)用这个`Base`类作为基类来写自己的ORM类。要定义`__tablename__`类属性,来指定这个模型映射到数据库中的表名。
class Person(Base):
    __tablename__ = ''person''
(3)在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。
from sqlalchemy import create_engine,Column,Integer,String

id = Column(Integer,primary_key=True,autoincrement=True)
(4)使用`Base.metadata.create_all()`来将模型映射到数据库中。
(5) 一旦使用`Base.metadata.create_all()`将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。目前来说,只能删除这个表重新建了

# Base.metadata.drop_all() # 删除这个表以及里面的数据
# Base.metadata.create_all() # 新建表以及表结构

### 完整示例代码
from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

HOSTNAME = ''127.0.0.1''
PORT = ''3306''
DATABASE = ''1''
USERNAME = ''root''
PASSWORD = ''root''

# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()

class Person(Base):
    __tablename__ = ''person''
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(50))
    age = Column(Integer)
    country = Column(String(50))

# Base.metadata.drop_all()
# Base.metadata.create_all()

# 新增多条数据
p1 = Person(name=''zhiliao1'',age=19,country=''china'')
p2 = Person(name=''zhiliao2'',age=20,country=''china'')
session.add_all([p1,p2])
session.commit()

# 查询数据
person = session.query(Person).first()
print(person)


### 使用Flask-SQLAlchemy去连接数据库:
1.数据库连接:
(1)跟sqlalchemy一样,定义好数据库连接字符串DB_URI。
(2)将这个定义好的数据库连接字符串DB_URI,通过`SQLALCHEMY_DATABASE_URI`这个键放到`app.config`中。
示例代码:app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI
(3)使用`flask_sqlalchemy.SQLAlchemy`这个类定义一个对象,并将`app`传入进去。
示例代码:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

2.创建ORM模型:
还是跟使用sqlalchemy一样,定义模型。现在不再是需要使用`delarative_base`来创建一个基类。而是使用`db.Model`来作为基类。

3.使用session:
以后session也不需要使用`sessionmaker`来创建了。直接使用`db.session`就可以了。操作这个session的时候就跟之前的`sqlalchemy`的`session`是一模一样的。

4.在模型类中,`Column`、`String`、`Integer`以及`relationship`等,都不需要导入了,直接使用`db`下面相应的属性名就可以了。
id = db.Column(db.Integer,primary_key=True,autoincrement=True)

# 将ORM模型映射到数据库:
1. db.drop_all()
2. db.create_all()

### 完整示例代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

HOSTNAME = ''127.0.0.1''
PORT = ''3306''
DATABASE = ''1''
USERNAME = ''root''
PASSWORD = ''root''

DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)

app.config[''SQLALCHEMY_DATABASE_URI''] = DB_URI
app.config[''SQLALCHEMY_TRACK_MODIFICATIONS''] = False

db = SQLAlchemy(app)

class UserModel(db.Model):
    __tablename__ = ''user_model''
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(50),nullable=False)

    def __repr__(self):
        return "<User(username: %s)>" % self.username

# db.drop_all()
# db.create_all()

class Article(db.Model):
    __tablename__ = ''article''
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(50),nullable=False)

# 新增数据
article = Article(title=''title one'')
db.session.add(article)
db.session.commit()

# 查询数据
article = Article.query.first()
print(article)

关于SQLAlchemy Joinedload过滤器列sqldeveloper过滤器的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于apscheduler遇到错误:SQLAlchemyJobStore requires SQLAlchemy、flask_sqlalchemy join的正确使用方法、flask_sqlalchemy和sqlalchemy的区别有哪些?、flask_sqlalchemy和sqlalchemy联系区别及其使用方式等相关内容,可以在本站寻找。

本文标签: