解决SQLAlchemy(Python)调用MySQL数据库时插入时间戳数据的问题

本文介绍如何使用Flask和SQLAlchemy实现实时更新的数据库,每秒插入一条包含时间戳的数据,涉及表结构定义、数据插入及定时任务实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在建表的类中定义时间戳类型的column时,应写成:
d_time = db.Column(db.DateTime, nullable=False)

向MySQL数据库中插入数据时,插入数据的类型和格式(以当前系统时间为例)应写成如下形式:
d_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
此处需要import time

这样插入数据库中的数据格式就是这样的了:
在这里插入图片描述
附上在Flask项目中利用SQLAlchemy建表,插入数据,删表全部代码:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import time
import csv
import pymysql
pymysql.install_as_MySQLdb()

app = Flask(__name__)

# 配置数据库地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1/real_time_db'
# 跟踪数据库的修改,默认填False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


class Fur(db.Model):
    # 定义表名
    __tablename__ = 'fur_data'
    id = db.Column(db.Integer, primary_key=True)
    current_A = db.Column(db.Float, nullable=False)
    current_B = db.Column(db.Float, nullable=False)
    current_C = db.Column(db.Float, nullable=False)
    action_A = db.Column(db.Float, nullable=False)
    action_B = db.Column(db.Float, nullable=False)
    action_C = db.Column(db.Float, nullable=False)
    d_time = db.Column(db.DateTime, nullable=False)


# 删除表
db.drop_all()
# 创建表
db.create_all()

reader = csv.reader(open('FMF_data.csv'))
# A,B,C电流和频率的list初始化
current_A_list = []
current_B_list = []
current_C_list = []
action_A_list = []
action_B_list = []
action_C_list = []

for list in reader:
    current_A_list.append(list[0])
    current_B_list.append(list[1])
    current_C_list.append(list[2])
    action_A_list.append(list[3])
    action_B_list.append(list[4])
    action_C_list.append(list[5])

len = len(current_A_list)
i = 0

# 每隔一秒插入一个数据
while True:
    time.sleep(1)
    current_A = current_A_list[i]
    current_B = current_B_list[i]
    current_C = current_C_list[i]
    action_A = action_A_list[i]
    action_B = action_B_list[i]
    action_C = action_C_list[i]
    d_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

    fur = Fur(current_A=current_A, current_B=current_B, current_C=current_C, action_A=action_A, action_B=action_B, action_C=action_C, d_time=d_time)
    db.session.add(fur)
    db.session.commit()
    print("插入成功!")
    i += 1
    if i == 3600:
        i = 0


@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

一个实时更新的数据库,每一秒插入一条数据,亲测可用!

完整代码的详细说明请参考我的另一篇博客:https://blog.youkuaiyun.com/xiecheng1995/article/details/92427868

本人原创。转载请标明出处,谢谢!

<think>嗯,用户之前让我帮忙设计一个天气预报数据采集程序,用Python编写,包括数据存储到数据库。现在他问的是如何使用mysql.connector库连接和操作MySQL数据库,将数据导入其中。之前我给的例子用的是SQLite,现在需要切换到MySQL。 首先,我需要确认用户的需求。他们可能已经熟悉了SQLite,但现在项目需要升级到MySQL,因为MySQL更适合生产环境,支持更复杂的操作和更高的并发。用户可能已经完成了数据采集和清洗部分,现在需要将存储模块从SQLite迁移到MySQL。 接下来,我应该考虑用户可能遇到的问题。比如,如何安装mysql.connector,连接字符串的参数,MySQL和SQLite在语法上的差异,比如AUTO_INCREMENT在MySQL中的使用,以及数据类型的不同,比如DATETIME和VARCHAR的长度。还有权限问题,用户是否有权限在MySQL中创建数据库和表。 然后,我需要提供清晰的步骤。首先是安装mysql.connector库,使用pip安装。然后修改数据库连接部分的代码,使用mysql.connector.connect,并提供正确的host、user、password、database参数。注意可能需要先创建数据库,比如用CREATE DATABASE IF NOT EXISTS。 然后,表结构可能需要调整,比如将AUTOINCREMENT改为AUTO_INCREMENT,并指定ENGINE=InnoDB等。在插入数据,注意占位符的变化,SQLite使用?,而MySQL使用%s,虽然mysql.connector也支持?,但为了统一,示例中使用%s更常见。 另外,异常处理也很重要,需要捕获mysql.connector的Error,并在出现问题回滚事务。用户可能还需要考虑数据库的持久连接,或者使用连接池,但在简单示例中可能不需要。 此外,用户可能需要设置权限,确保MySQL用户有创建表和插入数据的权限。如果遇到访问被拒绝的错误,需要检查用户的host和权限设置。 最后,扩展部分可以提到使用ORM如SQLAlchemy,或者异步操作,但用户当前的问题比较基础,所以保持示例简单明了,直接回答如何连接和操作即可。确保代码示例正确,并测试过,避免拼写错误,比如端口号3306是否正确,以及是否需要SSL连接等。</think>我将为您详细说明使用Python的`mysql.connector`库操作MySQL数据库的全流程,包含代码实现和关键技术要点: --- ### 一、环境准备 ```bash # 安装必要库 pip install mysql-connector-python ``` --- ### 二、数据库连接配置 ```python import mysql.connector from mysql.connector import Error DB_CONFIG = { "host": "localhost", "user": "your_username", "password": "your_password", "database": "weather_db", "port": 3306, "charset": "utf8mb4" } ``` --- ### 三、核心操作实现 #### 1. 创建数据库表 ```python def create_table(): create_table_sql = """ CREATE TABLE IF NOT EXISTS weather_data ( id INT AUTO_INCREMENT PRIMARY KEY, timestamp DATETIME NOT NULL, source VARCHAR(20) NOT NULL, temperature FLOAT, humidity INT, wind_speed FLOAT, pressure INT, rainfall FLOAT, INDEX timestamp_index (timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor() cursor.execute(create_table_sql) print("表创建成功") except Error as e: print(f"数据库错误: {e}") finally: if conn.is_connected(): cursor.close() conn.close() ``` #### 2. 数据插入操作(带防注入示例) ```python def insert_data(data): insert_sql = """ INSERT INTO weather_data (timestamp, source, temperature, humidity, wind_speed, pressure, rainfall) VALUES (%s, %s, %s, %s, %s, %s, %s) """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor() # 执行参数化查询 cursor.execute(insert_sql, ( data['timestamp'], data['source'], data['temperature'], data['humidity'], data['wind_speed'], data['pressure'], data.get('rainfall', 0) )) conn.commit() print(f"插入成功,ID: {cursor.lastrowid}") except Error as e: print(f"插入失败: {e}") conn.rollback() finally: if conn.is_connected(): cursor.close() conn.close() ``` --- ### 四、高级功能实现 #### 1. 批量插入优化 ```python def bulk_insert(data_list): insert_sql = """ INSERT INTO weather_data (timestamp, source, temperature, humidity, wind_speed, pressure, rainfall) VALUES (%s, %s, %s, %s, %s, %s, %s) """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor() # 转换为元组列表 values = [( d['timestamp'], d['source'], d['temperature'], d['humidity'], d['wind_speed'], d['pressure'], d.get('rainfall', 0) ) for d in data_list] cursor.executemany(insert_sql, values) conn.commit() print(f"批量插入 {cursor.rowcount} 条数据") except Error as e: print(f"批量插入失败: {e}") conn.rollback() finally: if conn.is_connected(): cursor.close() conn.close() ``` --- ### 五、连接池管理(生产环境推荐) ```python from mysql.connector import pooling # 创建连接池 db_pool = pooling.MySQLConnectionPool( pool_name="weather_pool", pool_size=5, **DB_CONFIG ) def get_connection(): return db_pool.get_connection() ``` --- ### 六、常见问题解决方案 1. **中文乱码问题** 确保数据库、表和连接都使用`utf8mb4`字符集 2. **连接超处理** ```python DB_CONFIG["connection_timeout"] = 10 # 设置超间 ``` 3. **SSL连接配置** ```python DB_CONFIG.update({ "ssl_ca": "/path/to/server-ca.pem", "ssl_cert": "/path/to/client-cert.pem", "ssl_key": "/path/to/client-key.pem" }) ``` --- ### 七、操作验证示例 ```python # 测试数据样例 test_data = { "timestamp": "2023-08-20 14:00:00", "source": "openweathermap", "temperature": 26.5, "humidity": 65, "wind_speed": 3.2, "pressure": 1013, "rainfall": 0.5 } # 执行测试 create_table() insert_data(test_data) ``` --- ### 八、性能优化建议 1. 使用`executemany()`进行批量插入,每批数据量控制在500-1000条 2. 高频操作使用连接池管理 3.时间戳字段建立索引 4. 启用数据库的查询缓存功能 5. 定期执行`ANALYZE TABLE`优化统计信息 --- 如果需要更详细的MySQL配置说明或遇到具体问题(如远程连接配置、存储过程调用等),可以告知具体需求方向。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值