如何解决通过sqlalchemy构造表时遇到麻烦
我正在尝试根据我使用psycopg2创建的连接到PostGres的模型在SqlAlchemy中创建表。由于某些原因,当我调用Base.metadata.create_all(engine)时,它引发错误AttributeError:'tuple'对象没有属性'_run_visitor'。我曾尝试寻找此错误,但实际上并不清楚其含义。我不知道是否需要使用其他版本的Python或其他版本。我正在使用Python 3.8和SqlAlchemy版本1.3.19。这是与我要执行的操作相关的代码。如果这很烦人,可以在https://github.com/u1209855/baseball处查看我的gitHub存储库。非常感谢!回购中将需要比这里更多的信息,我想这是您回答问题所需的全部信息。对此的编辑是我做了echo = True,看来它确实连接到了psql数据库,所以我不确定为什么它不能创建那些表...另一种编辑,尝试下载过往版本的sqlalchemy但没有运气。
from sqlalchemy import Column,INTEGER,NVARCHAR,TIMESTAMP,ForeignKey,DECIMAL,UniqueConstraint,JSON,\
FLOAT,VARCHAR,DATE
from database import Base
class Master(Base):
__tablename__ = "master"
__table_args__ = {"schema": "public"}
playerID = Column(VARCHAR(10),primary_key=True)
birthYear = Column(VARCHAR(4))
birthDay = Column(INTEGER)
birthCountry = Column(VARCHAR(15))
birthState = Column(VARCHAR(30))
deathYear = Column(VARCHAR(4))
deathMonth = Column(INTEGER)
deathDay = Column(INTEGER)
deathCountry = Column(VARCHAR(15))
deathState = Column(VARCHAR(30))
deathCity = Column(VARCHAR(30))
nameFirst = Column(VARCHAR(20))
nameLast = Column(VARCHAR(20))
nameGiven = Column(VARCHAR(60))
weight = Column(INTEGER)
height = Column(INTEGER)
bats = Column(VARCHAR(1))
debut = Column(DATE)
finalGame = Column(DATE)
retroID = Column(VARCHAR(10))
bbrefID = Column(VARCHAR(10))
def create_models(engine):
# print("dropping tables")
# Base.metadata.drop_all(engine)
print("creating tables")
Base.metadata.create_all(engine)
这是我的数据库。py
import sqlalchemy
import os
import models as m
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
Base = declarative_base()
def sqlalchemy_connect():
conn_str = 'postgresql+psycopg2://{user}:{password}@localhost:5432/{database}'.\
format(user="postgres",password="some_password",database='baseball')
engine = sqlalchemy.create_engine(conn_str,use_batch_mode=True,server_side_cursors=True)
Session = sqlalchemy.orm.sessionmaker(autoflush=False)
Session.configure(bind=engine)
session = Session()
return engine,session
def sqlalchemy_session():
engine = sqlalchemy_connect()
session = sqlalchemy.orm.scoped_session(sqlalchemy.orm.sessionmaker())
session.configure(bind=engine,autoflush=False,expire_on_commit=False)
return engine,session
def main():
engine = sqlalchemy_connect()
m.create_models(engine)
这是我跑步的主要内容。
import models as m
import database as db
if __name__ == '__main__':
engine,session = db.sqlalchemy_session()
m.create_models(engine)
解决方法
就像我的函数sqlalchemy_connect()只是需要返回引擎,而不是会话,它似乎可以解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。