在python中交叉引用两个表?
我有一张叫做article的桌子。它有一列article.id和article.snippet 我有另一张桌子,叫做article_vote。它有一列article_id,它是article.id的外键,vote_choice_id是1到6之间的数字 我想插入一个片段,让程序在vote\u choice\u id=1、vote\u choice\u id=2、vote\u choice\u id=3等情况下计算该片段的所有vote\u choice\u id。这意味着交叉引用这两个表,这让我感到困惑 以下是我当前的代码:在python中交叉引用两个表?,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我有一张叫做article的桌子。它有一列article.id和article.snippet 我有另一张桌子,叫做article_vote。它有一列article_id,它是article.id的外键,vote_choice_id是1到6之间的数字 我想插入一个片段,让程序在vote\u choice\u id=1、vote\u choice\u id=2、vote\u choice\u id=3等情况下计算该片段的所有vote\u choice\u id。这意味着交叉引用这两个表,这让我感到
##############################################
class Article(db.Model):
# object mirrors table 'article'
id = db.Column('id', db.Integer, primary_key=True)
title = db.Column(db.String(400))
url = db.Column(db.String(400))
image_url = db.Column(db.String(400))
snippet = db.Column(db.String(1000))
date_upload = db.Column(db.DateTime(), default=datetime.utcnow)
def __init__(self, title, url, image_url, snippet):
self.title = title
self.url = url
self.image_url = image_url
self.snippet = snippet
##############################################
class ArticleVote(db.Model):
# object mirrors table 'article_vote'
id = db.Column('id', db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.fb_id')) # Sloppy
article_id = db.Column(db.Integer, db.ForeignKey('article.id'))
vote_choice_id = db.Column(db.Integer)
comment = db.Column(db.String(400))
def __init__(self, user_id, article_id, vote_choice_id, comment):
self.user_id = user_id
self.article_id = article_id
self.vote_choice_id = vote_choice_id
self.comment = comment
下面是我在尝试遵循一个我不太理解的示例后写的内容:
##############################################
class PublicationVoteSummary():
# This object keeps the count of votes for a Publication
def __init__(self, article_id):
self.snippet = snippet
self.choice_count = {} # count by textual choice
self.choice_id = {}
pub_choice_list = VoteChoice.getVoteChoiceList()
for item in pub_choice_list:
self.choice_id[str(item.id)] = item.choice
for item in pub_choice_list:
self.choice_count[item.choice] = 0
self.total_votes = 0
def addVote(self, choice):
self.choice_count[choice] = self.choice_count[choice] + 1
self.total_votes = self.total_votes + 1
def getVoteCount(self, choice):
return self.choice_count[choice]
##############################################
def retrieve_publication_summary(article_id):
pub_obj = PublicationSummary(article_id)
publication_list = db.session.query(ArticleVote, Snippet).filter(ArticleVote.article_id == article_id).filter(
ArticleVote.vote_choice_id == 1).all()
for item in vote_choice_id:
# avs_obj.appendComment(item.comment) # 09/27 - added to show comments in results page
avs_obj.appendDetail((item[1].name, text, item[0].comment))
return pub_obj
我也试过:
SELECT 1.(count)
FROM article_vote
INNER JOIN vote_choice_id
ON Article.id = Article_vote.article_id
WHERE Article_vote.vote_choice_id = 1
只要给定代码段至少有一个投票选择id,此查询将输出该代码段的每个投票选择id的代码段和投票计数
import sqlalchemy as sa
q = (db.session.query(Article.snippet, ArticleVote.vote_choice_id, sa.func.count(ArticleVote.id))
.join(ArticleVote, Article.id == ArticleVote.article_id)
.group_by(Article.snippet, ArticleVote.vote_choice_id)
.order_by(Article.snippet, ArticleVote.vote_choice_id.desc()))
for snippet, vote_choice_id, count in q:
print(snippet, vote_choice_id, count)
该代码生成以下SQL:
选择article.snippet作为article\u snippet,article\u vote.vote\u choice\u id作为article\u vote\u choice\u id,countarticle\u vote.id作为count\u 1
从文章
加入article\u vote ON article.id=article\u vote.article\u id
按article.snippet分组,article\u vote.vote\u choice\u id
按文章排序。代码段,文章\u投票。投票\u选择\u id描述
并产生类似于
纽约时报638
《纽约时报》5 46
纽约时报436
纽约时报344
纽约时报234
...
要获取给定代码段的计数和投票选择id,可以通过向查询中添加筛选器并从输出中删除投票选择id以及GROUP by和ORDER by子句来获取:
生成此SQL:
选择article.snippet作为article\u snippet,countarticle\u vote.id作为count\u 1
从文章
加入article\u vote ON article.id=article\u vote.article\u id
其中article.snippet=?和article_vote.vote_choice_id=?
这个输出:
《纽约时报》34
你好。事实上,我正试图为所有具有相同代码片段的文章争取选票,代码片段是我的发布词——就像《纽约时报》网站一样,不仅仅是对那篇特定文章的投票。这似乎吸引了所有人对这篇文章的投票,而不是所有发表同一出版物的文章。这就是我试图交叉引用文章表的原因。我已更改了查询-它是否符合您的要求?是的!非常感谢,这已经困扰了我好几天了。如果你有机会的话:你知道我会如何将不同投票选择的计数存储为不同的变量吗?就像一个用于所有2的计数的变量,一个用于所有3的计数的不同变量,等等?我认为您不可能在一行中轻松获得它们-我建议修改第一个查询,例如在.join和.group\u by之间添加.filterArticleVote.vote\u choice\u id==2,这将为每个代码段/选项组合提供一行。
q = (db.session.query(Article.snippet, sa.func.count(ArticleVote.id))
.join(ArticleVote, Article.id == ArticleVote.article_id)
.filter(Article.snippet == 'New York Times')
.filter(ArticleVote.vote_choice_id == 2)
.group_by(Article.snippet))
for snippet, count in q:
print(snippet, count)