Я пытаюсь заполнить базу данных с помощью Python и SQLAlchemy, используя тот же синтаксис, который я использовал в предыдущих проектах, но теперь получаю следующую ошибку:
Traceback (most recent call last):
File "/home/vacosti/scraper_v2/populate_db.py", line 16, in
with Session(os.environ.get('DATABASE_URI'), future=True) as session, session.begin():
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/engine/util.py", line 147, in __exit__
with util.safe_reraise():
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/engine/util.py", line 145, in __exit__
self.commit()
File "", line 2, in commit
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1313, in commit
self._prepare_impl()
File "", line 2, in _prepare_impl
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1288, in _prepare_impl
self.session.flush()
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4352, in flush
self._flush(objects)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4487, in _flush
with util.safe_reraise():
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__
raise exc_value.with_traceback(exc_tb)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4448, in _flush
flush_context.execute()
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute
rec.execute(self)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute
util.preloaded.orm_persistence.save_obj(
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 60, in save_obj
for (
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 223, in _organize_states_for_save
for state, dict_, mapper, connection in _connections_for_states(
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1753, in _connections_for_states
connection = uowtransaction.transaction.connection(base_mapper)
File "", line 2, in connection
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1039, in connection
return self._connection_for_bind(bind, execution_options)
File "", line 2, in _connection_for_bind
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1175, in _connection_for_bind
conn = self._parent._connection_for_bind(
File "", line 2, in _connection_for_bind
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go
ret_value = fn(self, *arg, **kw)
File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind
conn = bind.connect()
AttributeError: 'str' object has no attribute 'connect'
from sqlalchemy import Column, Integer, String, Float, LargeBinary
from sqlalchemy.orm import declarative_base
Base = declarative_base()
class Product(Base): # type: ignore
__tablename__ = 'products'
id = Column(Integer, primary_key=True) #as per the docs The default value is the string "auto", which indicates that a single-column (i.e. non-composite) primary key that is of an INTEGER type with no other client-side or server-side default constructs indicated should receive auto increment semantics automatically.
external_id = Column(String, nullable=False, unique=True, index=True)
description = Column(String, nullable=False, index=True)
udescription = Column(String, nullable=False, index=True)
price = Column(Float, nullable=False)
image = Column(LargeBinary)
import os
import json
import codecs
from sqlalchemy.orm import Session
from database.tables import Product
from pathlib import Path
CURRENT_DIR = Path(__file__).parent
products = json.loads(codecs.open(os.path.join(CURRENT_DIR,'data/products.json')).read())
for product in products:
with Session(os.environ.get('DATABASE_URI'), future=True) as session, session.begin():
productORM = Product(external_id=product['product_id'], description=product['description'], udescription=product['udescription'], price=product['price'])
session.add(productORM)
Что касается синтаксиса с Session(...) как сеансом, session.begin():, в документации сказано, что я могу это сделать.
В чем может быть проблема в данном случае?
Я пытаюсь заполнить базу данных с помощью Python и SQLAlchemy, используя тот же синтаксис, который я использовал в предыдущих проектах, но теперь получаю следующую ошибку: [code]Traceback (most recent call last): File "/home/vacosti/scraper_v2/populate_db.py", line 16, in with Session(os.environ.get('DATABASE_URI'), future=True) as session, session.begin(): File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/engine/util.py", line 147, in __exit__ with util.safe_reraise(): File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ raise exc_value.with_traceback(exc_tb) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/engine/util.py", line 145, in __exit__ self.commit() File "", line 2, in commit File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go ret_value = fn(self, *arg, **kw) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1313, in commit self._prepare_impl() File "", line 2, in _prepare_impl File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go ret_value = fn(self, *arg, **kw) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1288, in _prepare_impl self.session.flush() File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4352, in flush self._flush(objects) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4487, in _flush with util.safe_reraise(): File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/util/langhelpers.py", line 146, in __exit__ raise exc_value.with_traceback(exc_tb) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 4448, in _flush flush_context.execute() File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 466, in execute rec.execute(self) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/unitofwork.py", line 642, in execute util.preloaded.orm_persistence.save_obj( File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 60, in save_obj for ( File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 223, in _organize_states_for_save for state, dict_, mapper, connection in _connections_for_states( File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/persistence.py", line 1753, in _connections_for_states connection = uowtransaction.transaction.connection(base_mapper) File "", line 2, in connection File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go ret_value = fn(self, *arg, **kw) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1039, in connection return self._connection_for_bind(bind, execution_options) File "", line 2, in _connection_for_bind File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go ret_value = fn(self, *arg, **kw) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1175, in _connection_for_bind conn = self._parent._connection_for_bind( File "", line 2, in _connection_for_bind File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/state_changes.py", line 139, in _go ret_value = fn(self, *arg, **kw) File "/home/vacosti/scraper_v2/svenv/lib/python3.10/site-packages/sqlalchemy/orm/session.py", line 1189, in _connection_for_bind conn = bind.connect() AttributeError: 'str' object has no attribute 'connect' [/code] Мое определение таблицы следующее: [code]from sqlalchemy import Column, Integer, String, Float, LargeBinary from sqlalchemy.orm import declarative_base
Base = declarative_base()
class Product(Base): # type: ignore __tablename__ = 'products' id = Column(Integer, primary_key=True) #as per the docs The default value is the string "auto", which indicates that a single-column (i.e. non-composite) primary key that is of an INTEGER type with no other client-side or server-side default constructs indicated should receive auto increment semantics automatically. external_id = Column(String, nullable=False, unique=True, index=True) description = Column(String, nullable=False, index=True) udescription = Column(String, nullable=False, index=True) price = Column(Float, nullable=False) image = Column(LargeBinary)
[/code] Мой код для заполнения базы данных следующий: [code]import os import json import codecs from sqlalchemy.orm import Session
from database.tables import Product
from pathlib import Path CURRENT_DIR = Path(__file__).parent
for product in products: with Session(os.environ.get('DATABASE_URI'), future=True) as session, session.begin(): productORM = Product(external_id=product['product_id'], description=product['description'], udescription=product['udescription'], price=product['price']) session.add(productORM) [/code] Что касается синтаксиса с Session(...) как сеансом, session.begin():, в документации сказано, что я могу это сделать. В чем может быть проблема в данном случае?