Sqlite вставить не добавляя никаких записей

Это мой код:

import os
path = '/home/test/'
os.system(f'rm -vf {path}myDB.db')
import sqlite3
import datetime
conn = sqlite3.connect(f"{path}myDB.db")
conn.execute(
    '''
    CREATE TABLE logs
    (id INTEGER PRIMARY KEY,
    userid INTEGER NOT NULL,
    email TEXT NOT NULL,
    ip_address TEXT,
    date DATE
    );
    '''
)

clients = [
    {'userid': 26026, 'email': '[email protected]', 'ip': '1.1.1.158', 'date': f'{datetime.datetime.now()}'},
    {'userid': 31010, 'email': '[email protected]', 'ip': '1.1.1.10', 'date': f'{datetime.datetime.now()}'},
    {'userid': 26076, 'email': '[email protected]', 'ip': '1.1.1.160', 'date': f'{datetime.datetime.now()}'},
]

for out in clients:
    conn.execute(
        f"""
        INSERT INTO logs (id, userid, email, ip_address, date)
        VALUES (NULL, {out['userid']}, '{out['email']}', '{out['ip']}', '{out['date']}')
        """)

conn.close()
conn = sqlite3.connect(f"{path}myDB.db")
conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute('SELECT * FROM logs')
output = []
for r in c.fetchall():
    output.append(dict(r))

for x in output: x

conn.close()

Он только создает файл и таблицу, но не вставляет никаких значений.

Что не так с моим кодом? Я попробовал несколько более простых примеров, и они сработали и вставили, но в реальном примере они не работают.

Я также вижу этот результат после запуска INSERT:

<sqlite3.Cursor object at 0x7f393d757bc0>
<sqlite3.Cursor object at 0x7f393d7578c0>
<sqlite3.Cursor object at 0x7f393d757bc0>

Несмотря на потенциальное снижение производительности во время выполнения, вы можете добавить autocommit=True в sqlite3.connect().

SIGHUP 16.06.2024 11:22

@SIGHUP, спасибо, но TypeError: autocommit is an invalid keyword argument for this function когда я использую sqlite3.connect(autocommit=True). Я делаю что-то не так?

Saeed 16.06.2024 11:52

Возможно, у вас устаревшая среда Python. Вы также пропустили путь к файлу БД. Ключевое слово autocommit определенно допустимо в Python 3.12.4.

SIGHUP 16.06.2024 12:54

@SIGHUP что для меня странно, так это то, что мой линтер - это vscode, показывает, что у меня есть это ключевое слово для этой функции, я проверяю исходный файл и вижу, что он у меня есть :( Я использую Python 3.10.13. Я также проверил его с помощью isolation_level, и он использует много оперативной памяти, я думаю, что метод лучше.

Saeed 16.06.2024 13:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не зафиксировали изменения в базе данных перед закрытием:

import os

path = "/tmp/"
os.system(f"rm -vf {path}myDB.db")
os.system(f"touch {path}myDB.db")

import datetime
import sqlite3

conn = sqlite3.connect(f"{path}myDB.db")
conn.execute(
    """
    CREATE TABLE logs
    (id INTEGER PRIMARY KEY,
    userid INTEGER NOT NULL,
    email TEXT NOT NULL,
    ip_address TEXT,
    date DATE
    );
    """
)

clients = [
    {
        "userid": 26026,
        "email": "[email protected]",
        "ip": "1.1.1.158",
        "date": f"{datetime.datetime.now()}",
    },
    {
        "userid": 31010,
        "email": "[email protected]",
        "ip": "1.1.1.10",
        "date": f"{datetime.datetime.now()}",
    },
    {
        "userid": 26076,
        "email": "[email protected]",
        "ip": "1.1.1.160",
        "date": f"{datetime.datetime.now()}",
    },
]

for out in clients:
    conn.execute(
        f"""
        INSERT INTO logs (id, userid, email, ip_address, date)
        VALUES (NULL, {out['userid']}, '{out['email']}', '{out['ip']}', '{out['date']}')
        """
    )

conn.commit()     # <--- put commit() here!

conn.close()
conn = sqlite3.connect(f"{path}myDB.db")
conn.row_factory = sqlite3.Row
c = conn.cursor()
c.execute("SELECT * FROM logs")

output = []

for r in c.fetchall():
    output.append(dict(r))

for x in output:
    print(x)

conn.close()

Тогда результат:

{'id': 1, 'userid': 26026, 'email': '[email protected]', 'ip_address': '1.1.1.158', 'date': '2024-06-16 10:58:07.105912'}
{'id': 2, 'userid': 31010, 'email': '[email protected]', 'ip_address': '1.1.1.10', 'date': '2024-06-16 10:58:07.105922'}
{'id': 3, 'userid': 26076, 'email': '[email protected]', 'ip_address': '1.1.1.160', 'date': '2024-06-16 10:58:07.105924'}

Другие вопросы по теме