我有一个带有日期的数据库架构(我无法更改)。它们被定义为:
+---------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
...
| access_date | int(10) unsigned | NO | | 0 | |
+---------------------+------------------+------+-----+---------+----------------+
Run Code Online (Sandbox Code Playgroud)
现在,我的模型定义如下:
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class logme(Base):
id_ = Column(Integer, primary_key=True)
...
access_date = Column(Integer, nullable=False, server_default=0)
Run Code Online (Sandbox Code Playgroud)
当我加载模型时,出现此错误:
sqlalchemy.exc.ArgumentError: Argument 'arg' is expected to be one of type '<class 'str'>' or '<class 'sqlalchemy.sql.elements.ClauseElement'>' or '<class 'sqlalchemy.sql.elements.TextClause'>', got '<class 'int'>'
Run Code Online (Sandbox Code Playgroud)
如果我注释掉 access_date 一切正常
小智 9
您正在使用server_default=参数,相反,您需要更改它以使用default=参数。以下文档链接中的更多信息。
也许这会有所帮助?( http://docs.sqlalchemy.org/en/rel_1_0/core/defaults.html )
标量默认值
最简单的默认值是用作列默认值的标量值:
Table("mytable", meta, Column("somecolumn", Integer, default =12) ) 上面,如果没有提供其他值,值“12”将在 INSERT 期间绑定为列值。
您正在使用server_default参数
server_default=0
Run Code Online (Sandbox Code Playgroud)
这是解释here
服务器端默认值¶
SQL 表达式默认值的一个变体是 server_default,它在 create() 操作期间放置在 CREATE TABLE 语句中:
t = Table('test', meta, Column('abc', String(20), server_default='abc'), Column('created_at', DateTime, server_default=text("sysdate")) ) 创建调用上表将产生:
CREATE TABLE test (abc varchar(20) default 'abc', created_at datetime default sysdate ) server_default 的行为类似于常规 SQL 默认的行为;如果它被放置在一个数据库的主键列上,该列没有“后取”ID 的方法,并且该语句不是“内联”的,则预执行 SQL 表达式;否则,SQLAlchemy 会在数据库端正常关闭默认设置。
我认为这个错误是不言自明的
Argument 'arg' is expected to be one of type '<class 'str'>' ....
got '<class 'int'>'
Run Code Online (Sandbox Code Playgroud)
更改该行如下:
access_date = Column(Integer, nullable=False, server_default="0")
Run Code Online (Sandbox Code Playgroud)
请将引号放在零左右。由于该列被定义为Integer服务器端默认值将是数字零,而不是字符串“0”
在不相关的注释中,我认为您需要其中一个nullable=False或server_default,而不是两者都需要。
当您说nullable=False您希望在 INSERT 语句中显式提供一个值时,因此server_default不需要。
OTOH,server_default表示可以在 INSERT 语句中不提供值,但数据库服务器仍会用您的值填充它server_default
| 归档时间: |
|
| 查看次数: |
4681 次 |
| 最近记录: |