Python/Telethon在SQLite数据库上操作错误:无法打开数据库文件
我有一个用Python和Telethon做的Telegram机器人项目,这个项目包含一个Python文件、一个SQLite数据库和一个配置文件。这个机器人在我本地的虚拟环境中运行得很好(这三个文件都在同一个文件夹里),但是当我尝试在Ubuntu服务器上运行这个Python文件时,遇到了以下错误。
项目文件放在 /usr/local/bin/project/
目录下:
Traceback (most recent call last):
File "/usr/local/bin/project/script.py", line 19, in <module>
client = TelegramClient(session_name, API_ID, API_HASH).start(bot_token=BOT_TOKEN)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/telethon/client/telegrambaseclient.py", line 289, in __init__
session = SQLiteSession(session)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/telethon/sessions/sqlite.py", line 47, in __init__
c = self._cursor()
^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/telethon/sessions/sqlite.py", line 242, in _cursor
self._conn = sqlite3.connect(self.filename,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
sqlite3.OperationalError: unable to open database file
下面是script.py的内容:
import configparser
import re
from telethon import TelegramClient, Button, events
import sqlite3
from datetime import datetime
import traceback
print("Initializing configurations...")
config = configparser.ConfigParser()
config.read('config.ini', encoding='utf-8')
API_ID = config.get('default','api_id')
API_HASH = config.get('default','api_hash')
BOT_TOKEN = config.get('default','bot_token')
session_name = "sessions/Bot"
# Start the bot session
client = TelegramClient(session_name, API_ID, API_HASH).start(bot_token=BOT_TOKEN)
@client.on(events.NewMessage(pattern="(?i)/start"))
async def start(event):
sender = await event.get_sender()
SENDER = str(sender.id)
await event.reply('Hello!.')
##### MAIN
if __name__ == '__main__':
try:
print("Initializing Database...")
# Connect to local database
db_name = 'database.db'
conn = sqlite3.connect(db_name, check_same_thread=False)
# Create the cursor
crsr = conn.cursor()
print("Connected to the database")
# Command that creates the "customers" table
sql_command = """CREATE TABLE IF NOT EXISTS customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
lname VARCHAR(200),
fname VARCHAR(200),
note VARCHAR(200));"""
crsr.execute(sql_command)
print("All tables are ready")
print("Bot Started")
client.run_until_disconnected()
except Exception as error:
print('Cause: {}'.format(error))
这些是 config.ini
的内容:
; DO NOT MODIFY THE LINE BELOW!!! ([default])
[default]
; EDITABLE FIELDS:
api_id = 000000
api_hash = 000000000000000000
bot_token = 00000000000000000000000000
我检查了这三个文件的权限,结果如下:
-rw-r--rw- 1 root root 10601 Mar 4 00:52 script.py
-rw-rw-rw- 1 root root 716800 Mar 4 00:52 database.db
-rw-r--rw- 1 root root 195 Mar 4 00:52 config.ini
1 个回答
3
TelegramClient
默认会尝试创建一个 sqlite 文件来存储会话信息。
你传给
TelegramClient
构造函数的第一个参数是会话名,默认情况下就是会话的名称(或者完整路径)。https://docs.telethon.dev/en/stable/concepts/sessions.html
因为你把会话命名为 "sessions/Bot"
,所以它会尝试找一个叫 "sessions"
的文件夹,然后创建一个名为 "Bot"
的数据库文件。但它找不到这个文件夹。
要解决这个问题,你可以把 session_name
改成一个简单的文件名,比如 "Bot"
。或者你也可以手动创建一个空的 sessions
文件夹,这样就可以正常工作了。
希望这能帮到你!