标签: sqlalchemy

Python Flask SQLalchemy查询过滤器通过布尔值忽略False

在我的数据库中,我有房间,这些房间有多个布尔值,例如has_tv

用户可以在城市中搜索房间,他将被重定向到结果页面,在该页面中找到搜索到的城市中的所有房间。

现在有一个过滤功能,可以按房间(例如有电视)过滤当前结果集。为此,用户选中具有以下值的复选框has_tv

我设法使其工作,但它不会忽略False值。这意味着如果用户选中has_tv它,则为true,但所有其他布尔值都为false(因为未选中它们)。因此,这将仅向我显示has_tv为true且所有其他值为false的结果,我需要查看has_tv为true且其他结果无关的结果,其中一些可以为false和true。

那就是我使用的atm:

if form.validate_on_submit():
    all_rooms_in_city = Zimmer.query.filter(or_(Zimmer.haustiere_erlaubt.is_(form.haustiere_erlaubt.data), Zimmer.bettwaesche_wird_gestellt.is_(form.bettwaesche_wird_gestellt.data))).all()
else:
    all_rooms_in_city = Zimmer.query.order_by(desc("stadt")).all()
Run Code Online (Sandbox Code Playgroud)

这些都是可以检查的值(有很多,所以不可能对所有可能性进行硬编码):

class FilterZimmerForm(Form):
    haustiere_erlaubt = BooleanField("Haustiere")
    bettwaesche_wird_gestellt = BooleanField("Bettwaesche")
    grill_vorhanden = BooleanField("grill_vorhanden")
    safe_vorhanden = BooleanField("safe_vorhanden")
    kuehlschrank_vorhanden = BooleanField("kuehlschrank_vorhanden")
    rauchen_erlaubt = BooleanField("rauchen_erlaubt")
    parkplatz_vorhanden = BooleanField("parkplatz_vorhanden")
    kochmoeglichkeit_vorhanden = BooleanField("kochmoeglichkeit_vorhanden")
    restaurant_im_haus_vorhanden = BooleanField("restaurant_im_haus_vorhanden")
    handtuecher_werden_gestellt = BooleanField("handtuecher_werden_gestellt")
    tv_vorhanden = BooleanField("tv_vorhanden")
    waschmoeglichkeit_vorhanden = BooleanField("waschmoeglichkeit_vorhanden")
    wlan_vorhanden = BooleanField("wlan_vorhanden")
Run Code Online (Sandbox Code Playgroud)

当然,如果稍后再说两个,则应显示所有房间,其中两个检查值均为真,而其他所有值都不要紧!

这是需要该功能的网站的屏幕截图: 在此处输入图片说明

编辑:

看来我找到了一种解决方案,已经测试了几次,它似乎可以按预期工作,但它似乎不是最佳实践:

if form.validate_on_submit():

    filter_result = []

    if form.haustiere_erlaubt.data == True:
        filter_result.append(Zimmer.haustiere_erlaubt.is_(True))
    if form.bettwaesche_wird_gestellt.data == True: …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy filter flask python-2.7

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

在SQLAlchemy查询中使用诸如substr(X,Y,Z)之类的SQL函数

我不知道如何将SQLite的函数(例如substr(X,Y,Z))与SQLAlchemy的查询表达式语法一起使用。我知道我可以使用原始查询,但这会使重用where子句更加困难。这是我的用例:

我有一个文件头表(或模型类),可以查询该表以识别和列出某些类型的文件。

class Blob(Base):
    __tablename__ = 'blob'

    _id = Column('_id', INTEGER, primary_key=True)
    size = Column('size', INTEGER)
    hash = Column('hash', TEXT)
    header = Column('header', BLOB)
    meta = Column('meta', BLOB)
Run Code Online (Sandbox Code Playgroud)

例如,要识别Exif图像,我可以使用以下原始查询:

select * from blob where substr(header,7,4) = X'45786966'
Run Code Online (Sandbox Code Playgroud)

X'45786966'只是使用ASCII编码BLOB的字符串的SQLite 文字Exif。实际上,where子句更加复杂,我想将它们用作联接的过滤条件,大致如下:

# define once at module level
exif_conditions = [functions.substr(Blob.header, 7, 4) == b'Exif']

# reuse for arbitrary queries
session.query(Blob.hash).filter(*exif_conditions)
session.query(...).join(...).options(...).filter(condition, *exif_conditions)
Run Code Online (Sandbox Code Playgroud)

有没有办法用SQLAlchemy做到这一点?

python sqlite sqlalchemy sql-function

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

无法使用sqlachemy查询json列

我正在尝试使用PostgreSQL的json列中的查询flask-sqlalchemy。这是我的代码

house_ = House()
results = house_.query.filter(
            House.information['branch_name'].astext == 'release0'
            ).all()
Run Code Online (Sandbox Code Playgroud)

我不确定是怎么了。我尝试使用.cast(Unicode)而不是astext

出现如下错误:

NotImplementedError: Operator 'getitem' is not supported on this expression
Run Code Online (Sandbox Code Playgroud)

python postgresql sqlalchemy python-2.7 flask-sqlalchemy

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

SQLAlchemy - 给定一个Query对象,您可以确定是否已经应用了限制?

如果您执行以下查询:

models.Article.query.limit(5).limit(10)
Run Code Online (Sandbox Code Playgroud)

限制实际上是10,5被覆盖.

我有一些代码想要对a应用限制Query,但前提是尚未应用.有没有办法确定是否已经有限制,缺少if 'LIMIT' in str(query):

python sqlalchemy

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

Flask-SQLAlchemy:更新一对多关系

我有两个模型:

class Project(db.Model):
    __tablename__ = 'project'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    timestamp = db.Column(db.DateTime)
    info = db.Column(db.Text(255))

    post = db.relationship('Post', backref=db.backref('projects'))

class Post(db.Model):
    __tablename__ = 'post'

    id = db.Column(db.Integer, primary_key=True)
    headline = db.Column(db.String(64))
    content = db.Column(db.Text(255))
    timestamp = db.Column(db.DateTime)

    projectId = db.Column(db.Integer, db.ForeignKey('project.id'))
Run Code Online (Sandbox Code Playgroud)

例如,如果我创建一个post实例,然后通过projectInstance.append(post(headline="...", content="..."))
Now 将其附加到项目中,则我想更新该post所属的项目。除了查询所需的项目,将帖子附加到该项目并将其从旧项目中删除,还有没有更简单的方法?

oldProject.remove(post)
newProject.append(post)
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

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

Python MySQL连接器返回字节数组,而不是常规字符串值

我正在将数据从一张表加载到熊猫,然后将该数据插入到新表中。但是,我看到的是字节数组,而不是普通的字符串值。

bytearray(b'TM16B0I8') 它应该是 TM16B0I8

我在这里做错了什么?

我的代码:

engine_str = 'mysql+mysqlconnector://user:pass@localhost/db'
engine = sqlalchemy.create_engine(engine_str, echo=False, encoding='utf-8')
connection = engine.connect()

th_df = pd.read_sql('select ticket_id, history_date', con=connection)

for row in th_df.to_dict(orient="records"):
    var_ticket_id = row['ticket_id']
    var_history_date = row['history_date']

    query = 'INSERT INTO new_table(ticket_id, history_date)....'
Run Code Online (Sandbox Code Playgroud)

python mysql sqlalchemy python-3.x pandas

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

如何在sqlalchemy中加入两个ORM表,但要将两列都归还?

我有一些看起来非常像这样的代码:

import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base

engine = sa.create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()


class OneThing(Base):
    __tablename__ = 'one'

    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.Text)
    value = sa.Column(sa.Text)


class OtherThing(Base):
    __tablename__ = 'other'

    id = sa.Column(sa.Integer, primary_key=True)
    some_deal = sa.Column(sa.Text)
    other_deal = sa.Column(sa.Text)

Base.metadata.create_all(engine)

session = sa.orm.sessionmaker(bind=engine)()
one = OneThing()
one.id = 42
one.name = 'hi'
one.value = 'roscivs'
session.add(one)
other = OtherThing()
other.id = 42
other.some_deal = 'brown'
other.other_deal = 'and sticky'
session.add(other)
session.commit()
Run Code Online (Sandbox Code Playgroud)

现在,我可以运行以下内容:

for …
Run Code Online (Sandbox Code Playgroud)

python orm sqlalchemy

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

Python + sqlAlchemy:将dtype对象动态更改为字符串

简而言之:我想将所有Pandas数据框中所有对象列的对象动态转换为字符串。我看到过有关一次转换的类似文章,但它们都没有涉及动态转换为字符串。

我正在使用Python 3.x将多个JSON文件写入我们的SQL Server数据库。当我导入JSON文件并将其存储在Pandas DF中时,所有字符串都存储为一个对象,因为其长度事先未知。因此,当我将数据写入SQL Server时,数据类型被选择为text而不是varchar(255)

有没有办法将dtype的所有列动态转换object为dtype string?字符串可以在前255个字符处剪切。

我尝试了以下操作,但使Python崩溃...

url = 'some-url-to-json-file'
params['connectionString'] = 'driver://user:pw@server/database'
engine = sqlalchemy.create_engine(connectionString)
response = requests.get(url)
pandasDF = pandas.DataFrame(response.json()['value'])

# Convert Objects to Strings
for cName in list(pandasDF.columns.values):
    if pandasDF[cName].dtype == 'object':
        pandasDF[cName] = pandasDF[cName].to_string
pandasDF.to_sql(tableName, engine, if_exists = 'append')
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy pandas

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

使用sqlite在sqlalchemy的引擎URL中添加三个斜杠?

SQLAlchemy的文档说:

:memory:如果没有文件路径,则sqlite 标识符是默认的。指定sqlite://,别无其他:

# in-memory database
e = create_engine('sqlite://')
Run Code Online (Sandbox Code Playgroud)

但是,我可以使用三个斜杠而不是两个(sqlite:///)吗?还是我可以自己使用:memory:sqlite:///:memory:)?这样一来,我可以在配置文件中定义所有引擎属性,然后执行以下操作:

url = f'{dialect}+{driver}://{username}:{password}@{host}:{port}/{path}'
Run Code Online (Sandbox Code Playgroud)

代替:

url = f'{dialect}+{driver}://{username}:{password}@{host}:{port}{'/' + path if path else ''}'
Run Code Online (Sandbox Code Playgroud)

但是我可以做

python sqlalchemy python-3.x

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

SQLAlchemy多对多加入

这是我的模型:产品和标签具有多对多关系

products_tags_table=db.Table('products_tags',
                        db.Column('product_id', db.Integer,db.ForeignKey('products.id'), nullable=False),
                        db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'),nullable=False),
                        db.PrimaryKeyConstraint('product_id', 'tag_id')
                        )

class Tag(db.Model):
    __tablename__ = "tags"
    id = db.Column( db.Integer, primary_key = True)
    name = db.Column( db.String(256) )
    description = db.Column( db.Text() )
    background_img_url = db.Column( db.String(256) )
    products =db.relationship('Product',
                              secondary=products_tags_table,
                              backref='product_tags'
                             )  




class Product(db.Model):
    __tablename__ = "products"
    id = db.Column( db.Integer, primary_key = True)
    name = db.Column( db.String(256) )
    tags=db.relationship('ProductTag',
                        secondary=products_tags_table,
                        backref='tag_products'
                        )  
Run Code Online (Sandbox Code Playgroud)

当我加入Tag with Product时.我收到了错误:

class'narlalchemy.exc.InvalidRequestError':找不到要加入的FROM子句.尝试加入,但得到:找不到'product_tags'和'产品'之间的任何外键关系.

这是我的加入代码:

avai_tags = Tag.query.join(Product).order_by(ProductTag.name)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

python many-to-many join sqlalchemy flask

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