Python中如何将字典数据插入到数据库?

s={'项目特色': '项目特色海景房 ', '建筑面积': '建筑面积 130000 平方米' }
例如我有以上的字典,并且在数据库中都建立了相对应的列名 然后


import pymysql
for key in s.keys():
cursor.execute("insert into 澳门 (%s) values (%s)",(key,s[key]))

然后提示
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''建筑面积') values ('建筑面积 130000 平方米')' at line 1")


Python中如何将字典数据插入到数据库?

15 回复

for 循环插入了 2 条数据,一条数据写入的字段是 “项目特色”,一条数据是 “建筑面积”,你确认么?


import sqlite3
from typing import Dict, Any

def insert_dict_to_db(data_dict: Dict[str, Any], table_name: str, db_path: str = "mydatabase.db"):
    """
    将字典数据插入SQLite数据库
    
    参数:
        data_dict: 要插入的字典数据
        table_name: 目标表名
        db_path: 数据库文件路径
    """
    if not data_dict:
        print("字典为空,无需插入")
        return
    
    # 获取字典的键和值
    columns = ', '.join(data_dict.keys())
    placeholders = ', '.join(['?' for _ in data_dict])
    values = tuple(data_dict.values())
    
    # 构建SQL语句
    sql = f"INSERT INTO {table_name} ({columns}) VALUES ({placeholders})"
    
    try:
        # 连接数据库并执行插入
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        
        # 如果表不存在则创建(根据字典键动态创建表)
        cursor.execute(f"""
            CREATE TABLE IF NOT EXISTS {table_name} (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                {', '.join([f'{key} TEXT' for key in data_dict.keys()])}
            )
        """)
        
        cursor.execute(sql, values)
        conn.commit()
        print(f"成功插入1条数据到{table_name}表,ID: {cursor.lastrowid}")
        
    except sqlite3.Error as e:
        print(f"数据库错误: {e}")
    finally:
        if conn:
            conn.close()

# 使用示例
if __name__ == "__main__":
    # 示例数据
    user_data = {
        "name": "张三",
        "age": 25,
        "email": "zhangsan@example.com",
        "city": "北京"
    }
    
    # 插入数据
    insert_dict_to_db(user_data, "users")
    
    # 验证插入结果
    conn = sqlite3.connect("mydatabase.db")
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM users")
    print("当前表中的数据:", cursor.fetchall())
    conn.close()

核心就三步:1)用字典的keys()构建列名;2)用values()构建参数值;3)用问号占位符防止SQL注入。用SQLite演示是因为它无需额外配置,实际工作中把sqlite3换成pymysql或psycopg2逻辑是一样的。

建议用ORM(比如SQLAlchemy)处理复杂场景更省事。

insert into table set value=“字典”

insert into 后面跟的是表名啊

python 连接 MySQL 没有真正的参数化查询

表名编码的问题?
反正我一般不会建中文名的表名

set 前面是 update 吧

执行了两条 insert 语句,每条少一个字段

所以我用 orm

谢谢大家回复…我发现是我蠢了…现在已经改好了,中文的表名可以用

为啥用 sqlalchemy 这样的 ORM 。建立好 model 之后,直接 xx_model(**temp_dict), 然后 add, commint 就行

中文表名…

如果是当成纯数据最好存进个 blob 里,非要存进 text 里的话先 base64 编码。最好不要拼接字符串,仔细转义,小心注入。

这种东西存 mongo 里比较好,或者弄成 json 再存。

是怎么解决的,能告诉下方法吗

回到顶部