V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  stdout  ›  全部回复第 4 页 / 共 6 页
回复总数  106
1  2  3  4  5  6  
2020-12-30 12:10:59 +08:00
回复了 freelancher 创建的主题 奇思妙想 想做原神这一类的开放世界游戏。美术外包出去。
其实独立开发做策略类,比如塔防类还是可以的。
2020-12-29 23:19:30 +08:00
回复了 YL3616 创建的主题 小米 小米 11 昨晚发布了,才 3999 元,大家会买吗?
讨厌手机。信息太多。很难专注
2020-12-29 20:54:11 +08:00
回复了 johnsona 创建的主题 Python Flask 源码系列文章
@johnsona 边看文档边写,或者自己抽象一层。我打包的 base 参考
```

class BaseModel(db.Model):
__abstract__ = True

create_time = db.Column(db.DateTime, nullable=False, index=True, comment='创建时间')
update_time = db.Column(db.DateTime, nullable=False, index=True, comment='修改时间')

# 另外一种方式处理自动更新
# created_at = db.Column(db.DateTime, default=sqlalchemy.func.now(), nullable=False)
# updated_at = db.Column(db.DateTime, default=sqlalchemy.func.now(), onupdate=sqlalchemy.func.now(), nullable=False)

@classmethod
def qry(cls) -> BaseQuery:
return db.session.query(cls)

@classmethod
def filter(cls, *args) -> Query:
return cls.qry().filter(*args)

@classmethod
def count(cls, rsql=None, sort=None, ignore_fields=None):
_q = cls.qry().filter(to_db_query_sql(cls, rsql, ignore_fields))
if sort is not None and sort != '':
_q = _q.order_by(to_db_order(cls, sort))
return _q.count()

@classmethod
def count_by(cls, **kwargs):
return cls.qry().filter_by(**kwargs).count()

@classmethod
def find(cls, rsql=None, sort=None, ignore_fields=None):
_q = cls.qry().filter(to_db_query_sql(cls, rsql, ignore_fields))
if sort is not None and sort != '':
_q = _q.order_by(to_db_order(cls, sort))
return _q.all()

@classmethod
def page_find(cls, page_num, page_size, rsql=None, sort=None, and_sql=None, ignore_fields=None):
if rsql is None or rsql.strip() == '':
rsql = and_sql
elif and_sql is not None:
rsql = "(%s) and (%s)" % (rsql, and_sql)
_q = cls.qry().filter(to_db_query_sql(cls, rsql, ignore_fields))
if sort is not None and sort != '':
_q = _q.order_by(to_db_order(cls, sort))
ret = _q.paginate(page_num, page_size)
return ret

@classmethod
def get(cls, _id):
# print(cls)
# print(__class__)
# print(__class__.__dict__)
# print(__class__.__bases__)
# print(__class__.__subclasses__())
return cls.qry().get(_id)

@classmethod
def delete(cls, _id):
cls.qry().filter(cls.id == _id).delete()
db.session.commit()

def save(self):
try:
db.session.add(self)
db.session.flush()
db.session.commit()
except BaseException as e:
_log.error(e)
db.session.rollback()

@classmethod
def add(cls, obj, save=True):
item = None
_type = type(obj)
if _type is dict:
item = cls.from_dict(obj)
elif _type is cls:
item = obj
if item is not None:
if hasattr(item, 'check') and callable(getattr(item, 'check')):
getattr(item, 'check')()
if save:
item.save()
return item

def update_from_dict(self, obj, valid_fields=None):
columns = [m.key for m in self.__table__.columns]
valid_keys = [k for k in obj.keys() if k in columns]
item = self.from_dict(obj)
for k in valid_keys:
if valid_fields is not None and k not in valid_fields:
continue
setattr(self, k, getattr(item, k))

@classmethod
def update(cls, obj, save=True, valid_fields=None):
item = None
_type = type(obj)
if _type is dict:
pk = inspect(cls).primary_key[0].name
if pk not in obj.keys():
return None
item = cls.get(obj[pk])
item.update_from_dict(obj, valid_fields)
elif _type is cls:
item = obj
if item is not None:
if hasattr(item, 'check') and callable(getattr(item, 'check')):
getattr(item, 'check')()
if save:
item.save()
return item

@classmethod
def find_one_by(cls, **kwargs):
return cls.qry().filter_by(**kwargs).one_or_none()

@classmethod
def find_first_by(cls, **kwargs):
return cls.qry().filter_by(**kwargs).first()

@classmethod
def find_all_by(cls, **kwargs) -> list:
return cls.qry().filter_by(**kwargs).all()

@classmethod
def from_dict(cls, obj):
if type(obj) not in [dict, RowProxy]:
return None
_obj = {}
columns = inspect(cls).columns
for column in columns:
if column.name not in obj.keys():
continue
obj_value = obj[column.name]
_type = type(column.type)
value = obj_value
if value is None:
pass
elif _type is Date:
value = to_local_datetime(obj_value).date()
elif _type is DateTime:
value = to_local_datetime(obj_value)
elif _type is Boolean:
if type(value) is str:
value = value.lower() == 'true'
else:
value = bool(obj_value)
elif _type is Integer:
if type(obj_value) is int:
value = obj_value
elif type(obj_value) is str:
if not obj_value.isdigit():
value = None
else:
value = int(obj_value)
elif _type is Float:
value = float(obj_value)
elif _type is int:
value = int(obj_value)
elif _type:
value = str(obj_value)
_obj[column.name] = value
# columns = [m.key for m in cls.__table__.columns]
# _obj = {k: v for k, v in obj.items() if k in columns}
return cls(**_obj)

def to_dict(self, rel=True, ignore=None):
"""Returns the model properties as a dict

:rtype: dict
"""
result = {}

if ignore is None:
ignore = []

columns = set([attr for attr in dir(self) if not attr.startswith('_')
and attr not in ignore
and attr not in ['metadata', 'query', 'query_class']
and not callable(getattr(self, attr))
])
if not rel:
columns = [m.key for m in self.__table__.columns]
for attr in columns:
value = getattr(self, attr)
if isinstance(value, list):
result[attr] = list(map(lambda x: x.to_dict() if hasattr(x, "to_dict") else x, value))
elif hasattr(value, "to_dict"):
result[attr] = value.to_dict()
elif isinstance(value, dict):
result[attr] = dict(map(
lambda item: (item[0], item[1].to_dict())
if hasattr(item[1], "to_dict") else item,
value.items()
))
else:
result[attr] = value
return result

def to_json(self):
def extended_encoder(x):
if isinstance(x, datetime.datetime):
return x.strftime("%Y-%m-%d %H:%M:%S")
if isinstance(x, datetime.date):
return x.strftime("%Y-%m-%d")
if isinstance(x, UUID):
return str(x)

json_ignore = []
if hasattr(self, '_json_ignore'):
json_ignore = self._json_ignore
return json.dumps(self.to_dict(ignore=json_ignore), default=extended_encoder)

@staticmethod
def result_to_dict(result, keys):
new_result = []
for row in result:
row = dict(zip([attr.name for attr in keys], row))
new_result.append(row)
return new_result
```
2020-12-29 19:33:31 +08:00
回复了 johnsona 创建的主题 Python Flask 源码系列文章
flask 的 pycharm 的自动提示太烂了。动态绑定的变量和方法导致补全太差。不知道后期是否会有改善。
2020-12-28 18:03:27 +08:00
回复了 stdout 创建的主题 程序员 乏力烦躁无欲望
@OldActorsSmile 前几年炒 btc,赚了几百万,亏到现在还有百万,赚钱的兴奋阀值早没有了。
2020-12-28 17:57:17 +08:00
回复了 stdout 创建的主题 程序员 乏力烦躁无欲望
@parthenon2007 每周晚上跑步 2 次,每次 3-5 公里,但是白天还是没有劲。
2020-12-28 17:56:04 +08:00
回复了 stdout 创建的主题 程序员 乏力烦躁无欲望
@feast 都几个月的,天天如此。也不能这么不调啊
2020-12-28 16:08:53 +08:00
回复了 superbai 创建的主题 程序员 Intellij IDEA 年底一般会有优惠活动吗?
开源版本就够用了。
2020-12-24 19:21:18 +08:00
回复了 funbox 创建的主题 MySQL 日常涨知识系列-惊天地泣鬼神的 sql, 300 行~~
比这多的我都见过。超级痛苦。
2020-12-23 14:11:06 +08:00
回复了 xwchenhui 创建的主题 NAS 6W 的 CPU 跑了 7 个虚拟机,快冒烟了
这个配置跑 10 个虚拟机问题都不大啊
2020-12-23 14:09:51 +08:00
回复了 luxinfl 创建的主题 程序员 工作 5 年了还想去外包,是不是没救了。坐标南京。
外包也不够稳定,尽可能选稳定的。
2020-12-23 14:09:16 +08:00
回复了 KalaSearch 创建的主题 程序员 写了篇文章 - 高性能 Nginx HTTPS 调优 如何为 HTTPS 提速 30%
好文,感谢分享
2020-12-22 17:49:37 +08:00
回复了 funnyecho 创建的主题 广州 因为寿司店的茶位费,第一次拨打了 12315
支持,我喜欢楼主这样的人,楼主这样的人越多,法制越健全。
2020-12-22 17:13:56 +08:00
回复了 handylive 创建的主题 Linux 大家用 Linux 或 FreeBSD 当桌面系统主要用来做什么
我都用了十几年了。最大的好处是万能定制。
openbox + lxqt + archlinux + squanshfs
有兴趣无聊可以看看我自己做的系统 https://github.com/Zeroman/zm.linux
我个人用了好多年了.
2020-12-22 17:11:43 +08:00
回复了 nonduality 创建的主题 Python 类似 FastAPI、基于 Django 的 REST API 框架
connexion 基于 openapi,个人认为开发最快了(熟悉 openapi 的前提)
2020-12-22 17:09:00 +08:00
回复了 CodeXx 创建的主题 Java Java 程序员,公司业务需要做桌面程序,应该用什么技术好
electron vue 比 java 简单多了
2020-12-22 15:57:19 +08:00
回复了 Macv1994 创建的主题 程序员 大家在建表的时候都使用外键吗?
连 join 都很少用了。关联越少越好
2020-12-22 14:20:01 +08:00
回复了 stdout 创建的主题 程序员 扎心的面试回复
这个岗位不是我投的,他们发了条信息给我,我礼貌拒绝了。接着就被屌了。
2020-12-22 14:16:52 +08:00
回复了 stdout 创建的主题 程序员 扎心的面试回复
不用理会了。志不同道不和。
1  2  3  4  5  6  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2394 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 35ms · UTC 10:07 · PVG 18:07 · LAX 03:07 · JFK 06:07
Developed with CodeLauncher
♥ Do have faith in what you're doing.