Это мой код:
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>
@SIGHUP, спасибо, но TypeError: autocommit is an invalid keyword argument for this function когда я использую sqlite3.connect(autocommit=True). Я делаю что-то не так?
Возможно, у вас устаревшая среда Python. Вы также пропустили путь к файлу БД. Ключевое слово autocommit определенно допустимо в Python 3.12.4.
@SIGHUP что для меня странно, так это то, что мой линтер - это vscode, показывает, что у меня есть это ключевое слово для этой функции, я проверяю исходный файл и вижу, что он у меня есть :( Я использую Python 3.10.13. Я также проверил его с помощью isolation_level, и он использует много оперативной памяти, я думаю, что метод лучше.






Вы не зафиксировали изменения в базе данных перед закрытием:
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'}
Несмотря на потенциальное снижение производительности во время выполнения, вы можете добавить autocommit=True в sqlite3.connect().