我是sqlalchemy的新手并遇到问题。
我找不到只插入新行的一部分的方法。
使用session.add()
如果我提供所有列,我可以插入一行。但是,如果我只想提供一些列呢?
在互联网上,我发现有些地方告诉我使用.insert()
sqlalchemy.sql.expression.insert(table, values=None, inline=False, **kwargs)
(编程新手,所以我还没有完全理解这些线)
我导入了
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql.expression import insert
Base = declarative_base()
engine = create_engine('sqlite:///test.db')
class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
password = Column(String)
email = Column(String)
def __init__(self, name, password, email):
self.name = name
self.password = password
self.email = email
Session = sessionmaker(bind=engine)
Session.configure(bind=engine)
session = Session()
session.add(users.insert().values(name="some name"))
现在最后一行不断给我一个AttributeError (Users has no attribute insert)
我做错了什么?
答案 0 :(得分:1)
'部分'插入意味着与完整插入相同,但是您没有将值指定为NULL
。数据库仍然可以使用您省略的列的架构中指定的默认值替换NULL
值。
在SQLAlchemy中,这意味着您将这些相同的列设置为None
;你甚至不必明确地这样做。
请注意,您在__init__
课程中不需要 Users
方法。这可能使您更难以指定某些列。 SQLAlchemy声明性基础为您提供了一个默认的__init__
方法,可以执行已经的操作,但也保留了默认值。
如果您不想完全删除__init__
,请将__init__
方法更改为默认为None
或明确指定None
列值,例如Burhan的答案:
class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
password = Column(String)
email = Column(String)
def __init__(self, name=None, password=None, email=None):
self.name = name
self.password = password
self.email = email
然后使用session.add(Users())
插入一个完全“空”的行(如果你删除了你的__init__
,那么这也行。)
答案 1 :(得分:0)
由于您使用的是declarative base,因此您可以执行以下操作:
u = Users('foo',None,None)
session.add(u)
session.commit()