例:
from sqlalchemy.dialects import mysql
from sqlalchemy import Integer, Column, update, insert
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Test(Base):
__tablename__ = "test"
a = Column(Integer, primary_key=True)
b = Column(Integer)
update_stmt = update(Test).where(Test.a == 1).values(b=2)
print update_stmt.compile(dialect=mysql.dialect(), compile_kwargs= {"literal_binds": True})
insert_stmt = insert(Test).values(a=1, b=1)
print insert_stmt.compile(dialect=mysql.dialect())
Run Code Online (Sandbox Code Playgroud)
结果是:
UPDATE test SET b=%s WHERE test.a = %s
INSERT INTO test (a, b) VALUES (%s, %s)
Run Code Online (Sandbox Code Playgroud)
问题是如何让sqlalchemy像这样生成smth:
UPDATE test SET b=2 WHERE test.a = 1
INSERT INTO test (a, b) VALUES (1, …Run Code Online (Sandbox Code Playgroud) 我有一个简单的模型类,代表两个角色之间的战斗:
class WaifuPickBattle(db.Model):
"""Table which represents a where one girl is chosen as a waifu."""
__tablename__ = "waifu_battles"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
date = db.Column(db.DateTime, nullable=False)
winner_name = db.Column(db.String, nullable=False)
loser_name = db.Column(db.String, nullable=False)
Run Code Online (Sandbox Code Playgroud)
我有一种构造CTE的方法,该CTE将战斗投射为一系列出场(每场战斗都有两次出场-胜利者和失败者):
def get_battle_appearences_cte():
"""Create a sqlalchemy subquery of the battle appearences."""
wins = select([
WaifuPickBattle.date,
WaifuPickBattle.winner_name.label("name"),
expression.literal_column("1").label("was_winner"),
expression.literal_column("0").label("was_loser")
])
losses = select([
WaifuPickBattle.date,
WaifuPickBattle.loser_name.label("name"),
expression.literal_column("0").label("was_winner"),
expression.literal_column("1").label("was_loser")
])
return wins.union_all(losses).cte("battle_appearence")
Run Code Online (Sandbox Code Playgroud)
然后,我有了一个查询,该查询利用此视图来确定战斗最多的角色:
def query_most_battled_waifus():
"""Find the waifus with the most battles in a …Run Code Online (Sandbox Code Playgroud) 基本上,我需要构建一个函数,该函数将根据给定日期过滤查询并返回一个新查询。我是 SQLAlchemy 的新手,我查找了类似的问题,但仍然遇到相同的错误:
`Don't know how to literal-quote value datetime.datetime(2018, 1, 1, 8, 3, 1, 438278)`
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
def filter_dates(query_obj, datecols, start = None, end = None):
if end is None:
end = datetime.datetime.now()
if start is None:
start = end - datetime.timedelta(weeks=12)
print("%s to %s" % (start, end))
for datecol in datecols:
print("Filtrando datas!")
query_obj = query_obj.filter(datecol >= start)
query_obj = query_obj.filter(datecol <= end)
ReevTable.print_query(query_obj)
return query_obj
Run Code Online (Sandbox Code Playgroud)
datecols 是一个 orm.attributes 对象。假设我有一个名为对象User有Datetime指定的属性created_at。这是预期的行为:
query = session.query(Company.name, …Run Code Online (Sandbox Code Playgroud) 我有一个包含字典作为元素的列表.所有字典都面对我的模式,是否有一种简单有效的方法可以在sqlalchemy中将这些细节插入到db中?
我的名单如下
[{id:'12',name:'a':lang:'eng},{id:'13',name:'b':lang:'eng},{id:'14',name:'c':lang:'eng}]
Run Code Online (Sandbox Code Playgroud)
我正在下面给出一个模式
id String(10)
name String(10)
lang String(10)
Run Code Online (Sandbox Code Playgroud) 我有一个 SQLAlchemy 查询,如下所示:
query = db.session.query(
Place.name,
Place.population,
).filter(Place.population==8000)
Run Code Online (Sandbox Code Playgroud)
但是当我打印查询时,结果如下:
SELECT place.name AS place_name, place.population AS place_population
FROM place
WHERE place.population = %(population_1)s
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它不断用 替换我的过滤条件%(population_1)s。这个查询是 Flask 应用程序的一部分,也许有什么我不明白的地方?
编辑:更改标题以更描述实际问题。