我在DEV和PROD中有不同的数据库版本。 DEV正在使用Postgres 9.5,而PROD正在使用9.4版。它适用于DEV,但不适用于PROD。我只想读取BIGINT字段的值。它们默默地限于MAX_INT!我已经在模型规则中的'number'中设置了字段。我如何阅读正确的值?
class KwController extends \yii\console\Controller {
public function actionTest() {
$accounts = Account::find()->all();
foreach ($accounts as $account) {
echo "$account->google_id\n";
//echo $account->google_id.PHP_EOL;
//printf("%s\n", $account->google_id);
}
}
class Account extends \yii\db\ActiveRecord
{
public function rules()
{
return [
[['google_id', 'bing_id'], 'number'],
[['name'], 'string', 'max' => 255]
];
}
dev=# \d account
Table "public.account"
Column | Type | Modifiers
-----------+------------------------+------------------------------------------------------
id | integer | not null default nextval('account_id_seq'::regclass)
name | character varying(255) |
google_id | bigint |
bing_id | bigint |
prod=> \d account
Table "public.account"
Column | Type | Modifiers
-----------+------------------------+------------------------------------------------------
id | integer | not null default nextval('account_id_seq'::regclass)
name | character varying(255) |
google_id | bigint |
bing_id | bigint |
dev=# select * from account;
id | name | google_id | bing_id
----+-----------+------------+---------
1 | Test | 1304682651 |
2 | Account 2 | 2712796608 |
prod=> select * from account;
id | name | google_id | bing_id
----+-----------+------------+---------
1 | Account 1 | 3797444208 |
2 | Account 2 | 8817806877 |
3 | Account 3 | 3199585540 |
4 | Account 4 | 1596230720 |
5 | Account 5 | 1389831585 |
$ /usr/sbin/postgres --version
postgres (PostgreSQL) 9.5.2
prod=> \c
psql (9.5.2, server 9.4.4)
我希望输出为
3797444208
8817806877
3199585540
1596230720
1389831585
请注意,DEV的值大于MAX_INT,但它可以正常工作。每当PROD的值大于MAX_INT时,它只会打印MAX_INT。
$ yii kw/test
1304682651
2712796608
$ YII_ENV=prod yii kw/test
2147483647
2147483647
2147483647
1596230720
1389831585
Yii 2.0.7,PHP 5.6.19,Windows / Cygwin(DEV),Heroku(PROD)
我还输入了一个bug,以防万一:https://github.com/yiisoft/yii2/issues/11286
答案 0 :(得分:1)
我不得不使用这个
$accounts = Account::find()->select(['*', 'google_id' => 'cast(google_id as varchar)'])->all();
但只是在抗议下。我不喜欢它!
警告,如果您使用架构缓存,则可能必须先让它过期,然后才能尝试更改。
'enableSchemaCache' => true,