在Python sqlalchemy中,如何使用declarative_base对象处理表行的生成?

时间:2019-06-26 14:52:19

标签: python sqlalchemy

我刚刚开始学习如何将sqlalchemy与mysql结合使用,并且我正在编写一个爬网程序以在微博(Twitter的中文版)中爬网用户发布的状态进行练习。我遇到以下问题:

我已经定义了一个mysql表来存储tweets信息,包括用户名,发布时间,发布文本等...

在我的工作人员中,代码经过一个人的页面,并且针对每种状态(或推特),它尝试先将项目保存到列表中,然后再保存到mysql表中。我正在尝试通过sqlalchemy做到这一点。

代码如下:

...etc

 def perform_work(self):

    id, name = self.current_item
    p = self.client.people(uid=id)

    rows = []
    try:
        for status in p.statuses.page(1):
            self.logger.info('{} got {}\'s status on {}'.format(self.name, p.name, status.created_at))

            rows.append(WeiboStatus(
                status_id = status.id,
                user_id = p.name,
                creation_time = status.created_at,
                text = status.text,
                reposts_count = status.reposts_count,
                attitudes_count = status.attitudes_count,
                comments_count = status.comments_count,
                source = status.source
            ))

            print('check row {}'.format(p.name))  # line 50

    except:
        pass


    return name, rows

WeiboStatus我们定义为:

import datetime
from sqlalchemy import Column, ForeignKey, text
from sqlalchemy.dialects.mysql import BIGINT, VARCHAR, DATETIME, INTEGER, LONGTEXT, TEXT
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from weibo.DB.Models.Followee import Followees

BASE = declarative_base()

class WeiboStatus(BASE):
    __tablename__ = 'user_weibo_status'

    status_id = Column('status_id', VARCHAR(60), primary_key=True)
    user_id = Column('user_id', VARCHAR(60), ForeignKey('followees.uid'))
    user_name = Column('user_name', VARCHAR(60), ForeignKey('followees.name'))
    creation_time = Column('creation_time', DATETIME, nullable=False, default=datetime.datetime.utcnow)
    text = Column('text', LONGTEXT(collation='utf8_bin'), nullable=True, default=None)
    reposts_count = Column('reposts_count', INTEGER)
    attitudes_count = Column('attitudes_count', INTEGER)
    comments_count = Column('comments_count', INTEGER)
    source = Column('source', TEXT) # todo: maybe other text type...

我遇到的问题是第50行print('check row {}'.format(p.name))从未执行。

我不知道为什么代码停留在rows.append(WeiboStatus(...))上 我使用sqlalchemy错误吗?

0 个答案:

没有答案