项目场景:
上一节我使用了pyenv控制我的mac的版本,
安装一手python
查看最新的python3的版本
pyenv latest -k 3
我当前看到的是最新是3.12.5
然后安装
pyenv install 3.12.5
设置全局的python环境
pyenv global 3.12.5
python环境安装完成,你可以使用python --version看看python版本
直接展示代码,遇到的问题再下面讲
提示:这里描述项目中遇到的问题:
例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据
APP 中接收数据代码:
import time
from datetime import datetime
import psycopg2
#自定义雪花算法,这里是复制的腾讯云社区的一段代码,
#https://cloud.tencent.cn/developer/article/2383263
class Snowflake:
def __init__(self, worker_id, data_center_id):
### 机器标识ID
self.worker_id = worker_id
### 数据中心ID
self.data_center_id = data_center_id
### 计数序列号
self.sequence = 0
### 时间戳
self.last_timestamp = -1
def next_id(self):
timestamp = int(time.time() * 1000)
if timestamp < self.last_timestamp:
raise Exception("Clock moved backwards. Refusing to generate id for %d milliseconds" % abs(timestamp - self.last_timestamp))
if timestamp == self.last_timestamp:
self.sequence = (self.sequence + 1) & 4095
if self.sequence == 0:
timestamp = self.wait_for_next_millis(self.last_timestamp)
else:
self.sequence = 0
self.last_timestamp = timestamp
return ((timestamp - 1288834974657) << 22) | (self.data_center_id << 17) | (self.worker_id << 12) | self.sequence
def wait_for_next_millis(self, last_timestamp):
timestamp = int(time.time() * 1000)
while timestamp <= last_timestamp:
timestamp = int(time.time() * 1000)
return timestamp
# 数据库连接配置
conn_params = {
"host": "localhost",
"port": "5432",
"database": "你的数据库名称",
"user": "数据库账号",
"password": "数据库密码"
}
### test雪花算法,你可以打开测试你的雪花算法
# if __name__ == '__main__':
# worker_id = 1
# data_center_id = 1
# snowflake = Snowflake(worker_id, data_center_id)
# for i in range(10):
# try:
# print(snowflake.next_id())
# except Exception as e:
# print("Clock moved backwards:", e)
# 连接到数据库
with psycopg2.connect(**conn_params) as conn:
with conn.cursor() as cur:
# 执行查询
cur.execute("SELECT a.id id, a.customer_id customer_id FROM xxx a where xxx = xxx")
# 创建字典并初始化
my_map = {
"aaa": "aaa",
"bbb": "bbb",
"ccc": "ccc",
}
# 获取所有查询结果
results = cur.fetchall()
print(results)
worker_id = 1
data_center_id = 1
snowflake = Snowflake(worker_id, data_center_id)
# 遍历结果并执行插入操作
for id, customer_id in results:
# 插入语句
for key, value in my_map.items():
# 获取当前时间
current_time = datetime.now()
# 将当前时间转换为timestamp格式
current_timestamp = psycopg2.Timestamp(current_time.year, current_time.month, current_time.day, current_time.hour, current_time.minute, current_time.second)
insert_query = "INSERT INTO xxx (id,xxx,xxx customer_id) VALUES (%s,%s,%s, %s)"
# 执行插入语句
cur.execute(insert_query, (snowflake.next_id(), key,value,customer_id))
# 提交事务
conn.commit()
遇到的问题psycopg2导入不进来:
我用pip install psycopg2老是报错,说是找不到postgres的pg_config配置,我服了难不成要我本地下载一个数据库,后面问了各种ai,最后chatgpt解决了。
解决过程,gpt推荐我去安装
pip install psycopg2-binary
这个倒是成功安装了,但是vscode编辑器代码里面还是报错,我就纳闷了,后面问了下gpt,需要改vscode的配置
下面是ChatGPT说的
1. 确保 VSCode 使用正确的 Python 解释器
Pylance 可能在使用不同的 Python 解释器,这可能导致它找不到 psycopg2 模块。
步骤:
打开 VSCode。
1.按 Cmd + Shift + P(或 Ctrl + Shift + P)打开命令面板。(ps:直接鼠标右键吧,下面也有命令面板)
2.输入并选择 "Python: Select Interpreter"。
3.选择与你在终端中使用的相同的 Python 解释器。
4.如果你使用虚拟环境,确保选择的是该虚拟环境的 Python 解释器。
至于我为什么选这个版本,首先我装的是pyenv的,然后路径带这个的比较对,然后我装的是3.12.5的python版本,那肯定是这个了。直接选择。到此,ok,全部搞定,错也不报了,爽了,直接运行,修改数据库成功。