我有一个电报机器人,其中有订阅该机器人的用户。例如,如果订阅到期前还剩一周,我想通知用户。我应该做什么更好?只需迭代整个表 (postgresql),选择付费订阅者,然后检查是否还剩 2 周或 1 周,机器人会通知用户。
为此,有一个想法可以通过检查select for update skip locked,或者使用 Redis 及其消息流(streams)。然后通过 celerybeat 使用它。
告诉我应该多久进行一次这些检查,有哪些做法,以便一切都得到优化。您应该使用哪个选项?
我有一个电报机器人,其中有订阅该机器人的用户。例如,如果订阅到期前还剩一周,我想通知用户。我应该做什么更好?只需迭代整个表 (postgresql),选择付费订阅者,然后检查是否还剩 2 周或 1 周,机器人会通知用户。
为此,有一个想法可以通过检查select for update skip locked,或者使用 Redis 及其消息流(streams)。然后通过 celerybeat 使用它。
告诉我应该多久进行一次这些检查,有哪些做法,以便一切都得到优化。您应该使用哪个选项?
我有一个小型库,我可以从网站获取一些数据,然后将其序列化。
我知道正确的开发方式是采用依赖注入的原理。在我的代码中有一个特定的基类,其中包含所有可用的方法。
class MyClass:
def __init__(self):
self.my_http_connection = HttpConnection()
def my_method(self):
return self.my_http_connection.get("address")
library = MyClass()
library.my_method()
在构造函数中,我创建了一个实例HttpConnection,事实上,我还有更多这样的实例,它们负责完全不同的情况。例如,哈希类。
以这种方式在构造函数中初始化类是否正确?这是好的做法吗?我阅读了 redis-py 和 aiogram 的源代码,这些东西是以完全不同的方式实现的。例如,aiogram 库中的任何方法都是通过__call__.有条件地
async def send_message(self):
call = SendMessage()
await self(call)
正因为如此,我不知道应该朝哪个方向去了解如何编写好的代码。
upd:我忘了提及我也分担课程的责任。我不会在一堂课上完成数学、http 请求和数据库工作。一个真实的例子如下所示:
class Explorer:
def __init__(self, connection: Http):
self.conn = connection
def get(url):
return self.conn.get(url)
class MyClass:
def __init__(self):
self.my_http_connection = Http()
self.serializer = Serializer()
self.explorer = Explorer(self.my_http_connection)
def my_method(self):
return self.serializer.serialize(self.explorer.get("address"))
library = MyClass()
library.my_method()
这就是我实现几乎所有代码的方式。而在explorer类中,以此类推,可能还有另一个类负责某事等等。
我和用户有一张桌子
| ID | 姓名 |
|---|---|
| 1 | 约翰 |
| 2 | 斯科特 |
还有一个表记录了他们的操作,例如创建消息。
| 外键ID | 文本 |
|---|---|
| 1 | 一些文字 |
| 2 | 任何文本 |
FOREIGN KEY (fk_id) REFERENCES users (id)
然后用户决定离开数据库。因此,应该删除第一个表中包含其数据的行,但这里会发生错误,因为fk_id它是第二个表中的外键。遇到这种情况怎么办?必须保存第二个表及其内容。
我正在开展一个项目,我想实施推荐奖金系统。之前,我创建了两个表users并referrers简单地在那里写下了必要的数据。我最近开始考虑创建一对多关系。我按照指南做了一切,但我不明白。
该表users是这样排列的:
| ID | 姓名 |
|---|---|
| 1 | 伊万 |
| 2 | 约翰 |
A referrers:
| 推荐人 ID | 推荐 ID |
|---|---|
| 1 | 2 |
代码如下所示:
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE referrers (
referrer_id int NOT NULL,
referral_id int NOT NULL,
FOREIGN KEY (referrer_id) REFERENCES users (id)
);
我正在使用 Python 中的类,并且需要实现指定不同数据的能力。就我而言,这是一个 dsn 连接或通过参数指定端口、登录名和密码。
所以我无法做出选择;如果未指定 dsn,则将读取其他参数,反之亦然。
class DB:
def __init__(self, dsn=None, **kwargs):
self.user = kwargs['user']
self.password = kwargs['host']
self.database = kwargs['host']
self.host = kwargs['host']
self.connection = None
async def connect(self):
self.connection = await asyncpg.connect(user=self.user, password=self.password, database=self.database, host=self.host)
async def execute(self, query, *args):
if self.connection is None:
await self.connect()
result = await self.connection.fetch(query, *args)
return result
async def close(self):
if self.connection is not None:
await self.connection.close()