在我的数据库中,我有房间,这些房间有多个布尔值,例如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) 我不知道如何将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做到这一点?
我正在尝试使用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) 如果您执行以下查询:
models.Article.query.limit(5).limit(10)
Run Code Online (Sandbox Code Playgroud)
限制实际上是10,5被覆盖.
我有一些代码想要对a应用限制Query,但前提是尚未应用.有没有办法确定是否已经有限制,缺少if 'LIMIT' in str(query):?
我有两个模型:
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) 我正在将数据从一张表加载到熊猫,然后将该数据插入到新表中。但是,我看到的是字节数组,而不是普通的字符串值。
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) 我有一些看起来非常像这样的代码:
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) 简而言之:我想将所有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)
:memory:如果没有文件路径,则sqlite 标识符是默认的。指定sqlite://,别无其他:Run Code Online (Sandbox Code Playgroud)# in-memory database e = create_engine('sqlite://')
但是,我可以使用三个斜杠而不是两个(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)
但是我可以做
这是我的模型:产品和标签具有多对多关系
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 ×10
sqlalchemy ×10
flask ×3
pandas ×2
python-2.7 ×2
python-3.x ×2
filter ×1
join ×1
many-to-many ×1
mysql ×1
orm ×1
postgresql ×1
sql-function ×1
sqlite ×1