sqlalchemy 日期错误。参数 'arg' 预期为 STR 但得到 INT

Pat*_*ery 3 python sqlalchemy

我有一个带有日期的数据库架构(我无法更改)。它们被定义为:

+---------------------+------------------+------+-----+---------+----------------+
| 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 会在数据库端正常关闭默认设置。


Man*_*aze 9

我认为这个错误是不言自明的

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=Falseserver_default,而不是两者都需要。

当您说nullable=False您希望在 INSERT 语句中显式提供一个值时,因此server_default不需要。

OTOH,server_default表示可以在 INSERT 语句中提供值,但数据库服务器仍会用您的值填充它server_default