日常开发遇到的一些坑,记录一下挺有意思的
python sqlalchemy 查询结果扩大化
1 2 3
| def get_self_info(uuid: str): tasks = session.query(SelfInfo).filter(uuid == uuid).all() return tasks
|
很明显的typo错误,uuid == uuid
是恒成立的,所以会返回所有的结果,导致某个用户获得全部的结果
应当改为
1 2 3
| def get_self_info(need_uuid: str): tasks = session.query(SelfInfo).filter(SelfInfo.uuid == need_uuid).all() return tasks
|
甚至
1 2 3
| def get_self_info(uuid: str): tasks = session.query(SelfInfo).filter(SelfInfo.uuid == uuid).all() return tasks
|
c++ Qt6 emit 时undefine
原因是类中没有添加QT的宏定义Q_OBJECT
,正常应该如下
1 2 3 4 5 6 7 8
| class BeaconTable :public BasicTable<TargetInfo> { Q_OBJECT signals: void doA(int Id); void doB(int Id); };
|
抽象类中不能使用该宏定义
c++ 抽象类
1 2 3
| template<typename T> class Table : {}
|
在cpp中要
1 2
| template<typename T> void Table<T>::deleteRow(int row){}
|
并且明确具体的抽象类
1 2
| template class Table<int>; template class Table<char*>;
|
python-asyncio.StreamReader read不完全
比如期待 data=read(n)
但是len(data) < n
是因为缓冲区大小或者去处理其他的read导致一次await read
无法读取完毕,但是可以利用循环分块读取
1 2 3 4 5
| while len(data) < file_len: chunk = await reader.read(file_len - len(data)) if not chunk: break data += chunk
|
python-sqlalchemy偶尔出现 tuple Index out of range

model如下
1 2 3 4 5 6 7
| class Sessions(Base): '''Session used in cookie''' __tablename__ = 'sessions' id = Column(Integer, primary_key=True, autoincrement=True) created_at = Column(Integer, default=lambda: int(time.time()), nullable=False) username = Column(String(32), nullable=False) token = Column(String(64), nullable=False)
|
查询controller如下
1 2 3 4 5 6 7
| def check_session(stoken: str) -> bool: from db import session exists = session.query( Sessions.id) .filter(Sessions.token == stoken) .all() return len(exists>=1)
|
可能有其他错误,并且只是偶尔发生


原因:DBAPI中的并发问题,一个连接不能同时处理大量信息
解决:在这个controller中新建一个连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class ConnDB: self.__engine = create_engine( 'sqlite:///{}'.format(self.__path), connect_args={"check_same_thread": False, "timeout": 30, "isolation_level": "IMMEDIATE"}, pool_pre_ping=True, echo=False) self.__session = sessionmaker(bind=self.__engine, autocommit=False, autoflush=False,)
Session = conn_db.get_session()
def check_session(stoken: str) -> bool: db = Session() exists = db.query( db.query(Sessions.id) .filter(Sessions.token == stoken) .exists() ).scalar() db.close() return exists
|
vscode鼠标拖动代码页分栏失效/没反应

环境:windows
解决方法:cmd+shift+p 运行两次 Developer: Toggle Screencast Mode
if-else与++i --i

写if
最好先把else
也写上,i++
是语句结束后i+1
,++i
是立即加
左值与右值
左值:表达式左边的值,可以被查找到地址的、持久存在的值
右值:字面量,或者std::move
后的左值
左值引用:就是变量的别名

右值引用:绑定到临时、即将销毁的对象,使用方法int &&right
。意义就是避免内存操作
构造函数
构造函数就是一个类初始化的时候所需要的函数,主要分为以下几类
- 默认构造函数
- 带参数的构造函数
- 拷贝构造函数:可以实现对象的深拷贝和浅拷贝,省略
&
会导致无限递归
- 移动构造函数:接受一个右值引用(
std::move
)
- 转换构造函数
- 委托构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Base {
public: int val;
Base():val(int(0)) { std::cout << "默认构造函数. value is " << this->val << std::endl; }
Base(int v):val(v) { std::cout << "带参数的构造函数. value is " << this->val << std::endl;
}
Base(const Base& other): val(other.val) { std::cout << "拷贝构造函数. value is " << this->val << std::endl; }
Base(Base&& other) noexcept: val(other.val) { other.val = 0xFF; std::cout << "移动构造函数. value is " << this->val << std::endl; }
explicit Base(double v): val(static_cast<int>(v)) { std::cout << "转换构造函数. value is " << this->val << std::endl; }
Base(char v) : Base() { this->val = v; std::cout << "委托构造函数. value is " << this->val << std::endl;
}
~Base() {}; };
int main() { Base a; Base b(1); Base c(b); Base d(std::move(b)); Base e(3.124); Base f('A');
return 0; }
|
