美文网首页
SQLALchemy踩坑日志

SQLALchemy踩坑日志

作者: 周末的游戏之旅 | 来源:发表于2019-09-24 16:15 被阅读0次

立个flag,这篇文章我会记录下我在用SQLALchemy中遇到的所有问题。另外,前端太难了,我是真的写不来😭

最近的爬虫项目需要添加用户操作,毕竟用命令和SQL管理数据太麻烦了。
朋友推荐用Flask,一个简单的web框架,我在对接mysql的时候遇到了很多问题,记一下。
flask对接MySQL是用的flask-sqlalchemy扩展。sqlalchemy是一个ORM(概念百度吧)。
以前没用过这个,现在需要将两个表做连接查询,用sql的话直接join就完事了(以前都是用pymysql)。
这个就比较麻烦了,需要在连接查询的表中做好外键和连接
表1,需要在表1中指明外键

class scan_result(db.Model):
    __tablename__ = 'scan_result'
    __table_args__ = {"useexisting": True}
    scan_id = db.Column(db.Integer, primary_key = True, autoincrement = True)
    url_id = db.Column(db.Integer, db.ForeignKey('list_url.url_id'), index=True)
    description = db.Column(db.String(255))
    type_id = db.Column(db.Integer, db.ForeignKey('url_type.type_id'))
    time = db.Column(db.DateTime)

    def __repr__(self):
        print("<scan_result(scan_id=%d, description='%s')>" % (self.scan_id, self.description))

表2,需要用relationship做好连接,注意这里要用backref指明关联属性的名字,例如我这里的url。这样在用scan_result做连接查询时就会自动在scan_result中创建url属性,通过url属性就可以拿到连接查询后对应的字段了。

很多教程中这里没有用bakcref做连接,而是直接.query(table1).join(table2),我尝试这样做的时候发现只能拿到table1中的字段,table2中的字段是拿不到的。也可能是flask-sqlalchemy更新了。

190925更新:backref的值要注意不能和models模块下的任意类中的任意字段重名,否则会报:该属性属于xxxClass的错误

class list_url(db.Model):
    __tablename__ = 'list_url'
    __table_args__ = {"useexisting": True}
    url_id = db.Column(db.Integer, primary_key = True, autoincrement=True)
    url = db.Column(db.String(255))
    realurl = db.Column(db.String(255))

    scan = db.relationship('app.models.scan_result',backref='url')

    def __repr__(self):
        print("<list_url(url='%s',realurl='%s')>" % (self.url,self.realurl))

完整代码

from app import db

class scan_result(db.Model):
    __tablename__ = 'scan_result'
    __table_args__ = {"useexisting": True}
    scan_id = db.Column(db.Integer, primary_key = True, autoincrement = True)
    url_id = db.Column(db.Integer, db.ForeignKey('list_url.url_id'), index=True)
    description = db.Column(db.String(255))
    type_id = db.Column(db.Integer, db.ForeignKey('url_type.type_id'))
    time = db.Column(db.DateTime)

    def __repr__(self):
        print("<scan_result(scan_id=%d, description='%s')>" % (self.scan_id, self.description))

class list_url(db.Model):
    __tablename__ = 'list_url'
    __table_args__ = {"useexisting": True}
    url_id = db.Column(db.Integer, primary_key = True, autoincrement=True)
    url = db.Column(db.String(255))
    realurl = db.Column(db.String(255))

    scan = db.relationship('app.models.scan_result',backref='url')

    def __repr__(self):
        print("<list_url(url='%s',realurl='%s')>" % (self.url,self.realurl))

class url_type(db.Model):
    __table_args__ = {"useexisting": True}
    type_id = db.Column(db.Integer, primary_key = True, autoincrement=True)
    name = db.Column(db.String(255))

    scan_result = db.relationship('app.models.scan_result',backref='type')

    def __repr__(self):
        print("<url_type(name='%s')>" % (self.name))
        
sr = scan_result.query.all()
print(sr[0].url)

相关文章

  • SQLALchemy踩坑日志

    立个flag,这篇文章我会记录下我在用SQLALchemy中遇到的所有问题。另外,前端太难了,我是真的写不来? 最...

  • flask-ORM

    一、ORM介绍 二、flask-sqlalchemy介绍及安装 mac安装mysqlclient踩过的坑,已在上一...

  • 2019-05-06

    ReactNative踩坑日志——OnPress随着render()执行被自动调用? 在ReactNative中,...

  • sqlalchemy 连接池QueuePool踩坑

    这里不啰嗦直接记录一下结论吧。 在使用sqlalchemy连接池的时候,配置好engine后部署项目,初始都是正常...

  • axios踩坑日志

    1. HTTP请求中的Form Data与Request Payload的区别 jquery中的ajax,data...

  • sqlalchemy 坑

    1 Base 类中类方法与属性名重合导致建表该字段缺失 ``` # zhong ```

  • [Django] 日志踩坑记

    Django官方推荐的日志就是python自带的 logger 模块。 python 官方文档指出: Althou...

  • JavaScrip-StepPitGuide《JavaScrip

    《JavaScript踩坑指南》JavaScrip-StepPitGuide? 《JavaScript踩坑指南》 ...

  • 算法踩坑6-二叉搜索树排序

    背景 接上面五篇文章算法踩坑-快速排序 算法踩坑2-插入排序 算法踩坑3-堆排序 算法踩坑4-冒泡排序 ...

  • 算法踩坑5-归并排序

    背景 接上面四篇文章算法踩坑-快速排序 算法踩坑2-插入排序 算法踩坑3-堆排序 算法踩坑4-冒泡排序 来...

网友评论

      本文标题:SQLALchemy踩坑日志

      本文链接:https://www.haomeiwen.com/subject/kgqbuctx.html