Проблема заключается в том, что ваш код последовательно использует одно и то же соединение с базой данных. Затем вы можете установить его один раз на то, что подходит для текущей среды.
Вместо того, чтобы передавать соединение с базой данных из метода в метод, возможно, имеет смысл сделать его одноэлементным.
def already_exists(story_data):
# Here `connection` is a singleton which returns the database connection.
connection.execute("""SELECT COUNT(*) from posts where post_id = ?""", (story_data.post_id,))
(number_of_rows,) = connection.fetchone()
if number_of_rows > 0:
return True
return False
Или создайте connection
метод для каждого класса и включите already_exists
в метод. Вероятно, это должен быть метод независимо.
def already_exists(self):
# Here the connection is associated with the object.
self.connection.execute("""SELECT COUNT(*) from posts where post_id = ?""", (self.post_id,))
(number_of_rows,) = self.connection.fetchone()
if number_of_rows > 0:
return True
return False
Но на самом деле вы не должны запускать этот код самостоятельно. Вместо этого вы должны использовать ORM , такой как SQLAlchemy , который позаботится об основных запросах и управлении соединениями, как это для вас. Он имеет одно соединение, «сессия» .
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy_declarative import Address, Base, Person
engine = create_engine('sqlite:///sqlalchemy_example.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
Затем вы используете это для выполнения запросов. Например, имеет метод exists
.
session.query(Post.id).filter(q.exists()).scalar()
Использование ORM значительно упростит ваш код. Вот краткое руководство по основам и длиннее и более полное руководство .