最近在写一个爬虫的程序,需要后台定时爬取网站的内容,涉及到SQLAlchemy
因为使用方法的帖子很多,但是很多地方都没有详细讲清楚,自己慢慢实验探索了一下,总结一下
from flask_apscheduler import APScheduler
- 首先是关于多模块的定时任务,采取和
SQLAlchemy
相似的策略。将APScheduler的实例化,配置,实例和配置与Flask的app
的连接,分别放在不同的模块,详细下次补充!!(不是本篇重点) - 因为job有两种方式添加,一是在放在配置文件的
JOBS
list中,二是实例.add_job(...)
,
# 对多个函数传递数据模型,模型更改是否生效的测试
def A():
res = Group.query.filter(Group.groupName == 'IGG').first()
print('找到IG,将模型传入B')
B(res)
def B(group):
print('B函数,欲在B函数中修改模型,测试是否生效')
group.groupName = 'IG'
db.session.commit()
print(Group.query.filter(Group.groupId == group.groupId).first().groupName)
待优化
数据库结构
类结构
flask 控制台输出到文件(logging)
异常捕获
导出.sql文件
D:
cd pycharm/项目名
mysqldump -uroot -p contend_observe_system > contend_observe_system.sql
报错
Python3.6报错:ModuleNotFoundError: No module named ‘MySQLdb’
pip install pymysql
然后数据库的配置文件:
DEBUG = True
# dialect+driver://username:password@host:port/database
DIALECT = 'mysql'
# DRIVER = 'mysqldb' # MySQLdb只支持Python2.,还不支持3.
DRIVER = 'pymysql' # 将驱动改成python3支持的pymysql
USERNAME = 'xxxx'
PASSWORD = 'xxxxxxxx'
HOST = '127.0.0.1'
PORT = '3306'
DATABASE = 'xxxx'
# USERNAME、PASSWORD、DATABASE要记得随着项目和数据库的不同而进行更改
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
HTTP/1.1 301 Moved Permanently
解决:将http改成了https
删除一个有外键约束的属性
解决:先删除外键约束,再删除属性
502 bad gateway
一般是程序app.py
错误,查看error.log文件,一般都可以解决
Mysql错误1452 - Cannot add or update a child row: a foreign key constraint fails
检查是不是创建关系表的时候,外键约束的位置搞错了地方
码住一篇大佬的Mysql错误1452
HTTP 405 Method Not Allowed
一看['GET','POST']
是不是请求方式的问题,二看前端的Content-Type是不是application/json
,三看前端传输的头部信息
SQLAlchemy不支持日期DateTime类型的模糊查询
假如存入的时间是"%Y-%m-%d %H:%M:%S"
这种形式,但是想仅以"%Y-%m-%d
来进行模糊查询,不能用xxx.query.filter(xxx.datetime.like(...))
这种模糊查询的方式
# 方法一
resFromSql = Contend.query.filter(db.cast(Contend.contendTime, db.Date) == db.cast(eachDate, db.Date)).all()
# 方法二
from sqlalchemy import extract
eachDate = datetime.datetime.strptime(eachDate,"%Y-%m-%d")
resFromSql = Contend.query.filter(
extract('year', Contend.contendTime) == eachDate.year,
extract('month', Contend.contendTime) == eachDate.month,
extract('day', Contend.contendTime) == eachDate.day).all()
pymysql.err.OperationalError: (1045, "Access denied for user ‘root’@'localhost
错误原因,SQLAlchemy配置文件有错误,仔细检查每一项!!
在for循环中直接更改列表中元素的值不会起作用
animal = ['dog','mouse','pig'] # 欲对每一项进行修改成'welost'
# 这种方式修改列表的值不会起作用
for each in animal:
each = 'welost'
print(animal) # 结果['dog','mouse','pig']
# 正确修改方式
for index in range(len(animal)):
animal[index] = 'welost'
print(animal) # 结果['welost','welost','welost']
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table ‘cos.playWithQualification’ doesn’t
php_Myadmin中的查询区分大小写,数据库中存储的表名是全小写playwithqualification
,而models.py
文件中表的类结构中__tablename__ = playWithQualification
,所以查询不到该表。
解决:models中的关系表的类结构中__tablename__
要全小写!!
TypeError: string indices must be integers, not str
问题描述:前端同时发送文件(File)与文本(Text),发送的Context-Type是multipart/form-date
,其中文本内容有一个表单(字典)嵌套,如下:
data = {
'userId':'xxxxx',
'gameId':'1',
'detail':{ //嵌套
'hobby':'xxx',
'advatagement':'xxxxxxxxx
}
}
后台收到后,打印出来如下:
{'userId': 'xxxxx', 'gameId': '1', 'detail': '[object Object]'}
在后台暂时没找到能把[object Object]
从对象类型解码出来的方法。(对 json的理解不深刻,去查了,前端可以用JSON.stringify()
解码出来,后台没得类似的函数可以用)
后面又找到说表单form不能嵌套表单,估计这个可能是正解,所以只能把'detail'
里面的项分出来放,如下:
data = {
'userId':'xxxxx',
'gameId':'1',
'hobby':'xxx',
'advatagement':'xxxxxxxxx
}
总结一句:Context-Type = multipart/form-date
时,文本信息无法进行表单(字典)嵌套
嵌套还是老老实实用application/json